【发布时间】:2019-09-28 16:01:19
【问题描述】:
我无法理解为什么使用 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 语句中定义,而是在我们的case 语句中使用i:
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")
}
并且输出没有改变。这两种形式似乎可以互换。当我可以使用i 时,为什么还要麻烦定义v?后一种情况更简单,因为要跟踪的变量更少;也许它的性能更高。
【问题讨论】:
-
添加JimB答案,i是interface{}类型,v是根据i的内部类型键入的。所以如果 v 是一个定义了方法的结构,你可以在 v 而不是 i 上调用这些方法。您提供的要测试的代码令人困惑,因为您将类型语义与打印动词 (%T) 混合在一起。最后,这两种形式是不可互换的。
-
尝试在这个 (play.golang.com/p/soqsNXsm_k0) 程序中使用
i,看看它是否可以编译。
标签: go types switch-statement declaration definition