猿问

Golang有没有类似C++的decltype?

C++ 有decltype(expr). 您可以声明某个其他表达式类型的对象。例如: decltype('c') a[4]将声明一个包含 4 个字符的数组。这是一个玩具示例,但此功能可能很有用。这是 UDP 服务器的一些 Go 代码:


conn, err := net.ListenUDP("udp", udp_addr)

...

defer conn.Close()

...

_, err = conn.WriteToUDP(data, addr)

重要的是我知道我可以用函数的(类型)结果做什么(在这种情况下,有一个连接,结果)ListenUDP,但我不知道这个类型是什么。在这里,因为 Go 的类型推断,我不需要知道。但是如果我想创建 5 个连接,那么我想要一个包含 5 个“结果ListenUDP”的数组。我做不到。我得到的最接近的是:


ret_type := reflect.TypeOf(net.DialUDP)

first_param_type := reflect.TypeOf(ret_type.Out(0))

my_arr := reflect.ArrayOf(4, first_param_type)

my_arr[0] = nil

但是最后一行不起作用。有没有办法在 Go 中做到这一点?


慕斯王
浏览 106回答 1
1回答

森栏

Go 没有与 C++ 的decltype.但是 Go 是一种静态类型语言:即使在短变量声明的情况下存在类型推断,类型在编译时也是已知的。的结果类型net.ListenUDP()在源代码中不可见,但您可以同样轻松地查找它,例如,用鼠标将鼠标悬停在它上面需要 2 秒钟,您的 IDE 将显示签名。或者上网查。或者go doc net.ListenUDP在终端中运行。的签名net.ListenUDP()是:func&nbsp;ListenUDP(network&nbsp;string,&nbsp;laddr&nbsp;*UDPAddr)&nbsp;(*UDPConn,&nbsp;error)因此,保存 5 个返回连接的数组类型是[5]*net.UDPConn。另请注意,在 Go中使用切片比使用数组更好也更容易。所以我建议使用切片类型[]*net.UDPConn。如果你需要一个 slice 来保持 5 个连接,你可以像这样使用内置函数来实现它make():make([]*net.UDPConn, 5)如果你真的需要在运行时动态地这样做,是的,反射可以做到这一点。这就是它的样子:funcType := reflect.TypeOf(net.ListenUDP)resultType := funcType.Out(0)arrType := reflect.ArrayOf(4, resultType)arrValue := reflect.New(arrType).Elem()conn := &net.UDPConn{}arrValue.Index(0).Set(reflect.ValueOf(conn))fmt.Println(arrValue)这将输出(在Go Playground上尝试):[0xc00000e058&nbsp;<nil>&nbsp;<nil>&nbsp;<nil>]参见相关:在 Go 中与类型在同一行上声明多个变量
随时随地看视频慕课网APP

相关分类

Go
我要回答