为什么在Go类型开关中声明了一个单独的变量?

时间:2019-05-10 18:05:52

标签: go types switch-statement declaration definition

我很难理解为什么类型开关要用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?后一种情况比较简单,因为要跟踪的变量较少。也许它的性能更高。

1 个答案:

答案 0 :(得分:0)

它们不可互换;您只是将i传递给一个可以接受它的函数,而不论其类型如何(格式字符串后面的fmt.Printf的参数都是interface{}类型)。 i仍然是其原始类型,因为变量的类型无法更改

如果您实际上想根据其类型来做某事,则需要第一种形式,以便v属于case语句中的类型。无论您是否将类型化的值分配给变量,原始变量i都会保留其原始类型。

Tour of Go: Type switches

中对此进行了详细介绍