У меня проблемы с пониманием того, почему переключатели типов записываются с дополнительной переменной, определенной в операторе switch.Приведенный ниже код, по-видимому, является санкционированным способом выполнения действий:
func test_func(i interface{}) {
switch v := i.(type) {
case int:
fmt.Printf("%T\n", v)
case float64:
fmt.Printf("%T\n", v)
case int:
fmt.Printf("I don't know about type %T!\n", v)
}
}
func main() {
test_func(float64(34))
test_func(int(34))
test_func("hello world")
}
Как и ожидалось, это возвращает:
float64
int
I don't know about type string!
Однако я могу немного изменить test_func
, чтобы v
не определен в операторе switch
, и вместо этого мы используем i
внутри наших операторов case:
func test_func(i interface{}) {
switch i.(type) {
case int:
fmt.Printf("%T\n", i)
case float64:
fmt.Printf("%T\n", i)
case int:
fmt.Printf("I don't know about type %T!\n", i)
}
}
func main() {
test_func(float64(34))
test_func(int(34))
test_func("hello world")
}
И вывод не изменяется.Кажется, две формы взаимозаменяемы.Зачем мне пытаться определить v
, когда я могу просто использовать i
?Последний случай проще, так как есть одна переменная, которую нужно отслеживать;может быть, это даже более производительно.