我很难理解为什么类型开关要用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")
}
并且输出不变。看来这两种形式是可以互换的。当我只使用v
时,为什么要麻烦定义i
?后一种情况比较简单,因为要跟踪的变量较少。也许它的性能更高。
答案 0 :(得分:0)
它们不可互换;您只是将i
传递给一个可以接受它的函数,而不论其类型如何(格式字符串后面的fmt.Printf
的参数都是interface{}
类型)。 i
仍然是其原始类型,因为变量的类型无法更改。
如果您实际上想根据其类型来做某事,则需要第一种形式,以便v
属于case
语句中的类型。无论您是否将类型化的值分配给变量,原始变量i
都会保留其原始类型。