为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕斯王 2022-12-05 16:26:50
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 中做到这一点?
查看完整描述

1 回答

?
森栏

TA贡献1810条经验 获得超5个赞

Go 没有与 C++ 的decltype.

但是 Go 是一种静态类型语言:即使在短变量声明的情况下存在类型推断,类型在编译时也是已知的。的结果类型net.ListenUDP()在源代码中不可见,但您可以同样轻松地查找它,例如,用鼠标将鼠标悬停在它上面需要 2 秒钟,您的 IDE 将显示签名。或者上网查。或者go doc net.ListenUDP在终端中运行。

的签名net.ListenUDP()是:

func ListenUDP(network string, laddr *UDPAddr) (*UDPConn, 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 <nil> <nil> <nil>]

参见相关:在 Go 中与类型在同一行上声明多个变量


查看完整回答
反对 回复 2022-12-05
  • 1 回答
  • 0 关注
  • 105 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信