Um switch de tipo é como uma instrução switch regular, mas os cases especificam tipos (não valores) que são comparados com o tipo do valor mantido pelo valor de interface fornecido.
switch v := i.(type) {
case string:
fmt.Println(v)
case int:
fmt.Println(v+2)
}
O type assertion acontece implicitamente para o tipo correto na hora da definição da variável v. Lembrando que usar a notação i.(type) só é válida dentro de um switch.