Type assertion: v, ok := i.(ConcreteType) — безопасная проверка, ok будет false если тип не совпал. Без ok — паника при несовпадении.
Type switch для множества типов:
switch v := i.(type) {
case string:
fmt.Println("string:", v)
case int:
fmt.Println("int:", v)
default:
fmt.Println("unknown")
}
reflect.TypeOf(i) — для рефлексии, когда типы неизвестны на этапе компиляции. Предпочитай type assertion/switch — они проверяются компилятором.