gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 03:36:18 26 4
gpt4 key购买 nike

我无法理解为什么类型开关是用 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")
}

并且输出没有改变。这两种形式似乎可以互换。当我可以只使用 i 时,为什么还要麻烦定义 v?后一种情况更简单,因为需要跟踪的变量更少;也许它的性能更高。

最佳答案

它们不可互换;你只是将 i 传递给一个可以接受它的函数,而不管它的类型(fmt.Printf 格式字符串之后的参数是 interface{ })。 i 仍然是它的原始类型,因为变量的类型不能改变

如果你真的想根据它的类型对它做一些事情,你需要第一种形式,这样 v 就是 case 语句中的类型.无论您是否将键入的值分配给变量,原始变量 i 都会保留其原始类型。

这在 Tour of Go: Type switches 中有很好的介绍。

关于go - 为什么在 Go 类型开关中声明一个单独的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56082759/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com