登录
首页 >  Golang >  Go问答

Golang有类似C++的decltype的东西吗?

来源:stackoverflow

时间:2024-04-05 18:57:38 408浏览 收藏

学习Golang要努力,但是不要急!今天的这篇文章《Golang有类似C++的decltype的东西吗?》将会介绍到等等知识点,如果你想深入学习Golang,可以关注我!我会持续更新相关文章的,希望对大家都能有所帮助!

问题内容

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 中做到这一点?


正确答案


go 没有相当于 c++ 的 decltype 的编译时。

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

net.listenudp() 的签名为:

func listenudp(network string, laddr *udpaddr) (*udpconn, error)

因此,保存 5 个返回连接的数组类型是 [5]*net.udpconn。另请注意,在 go 中使用 slices 而不是 arrays 更好、更容易。

因此,我建议使用切片类型 []*net.udpconn。如果您需要一个切片来容纳 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   ]

查看相关:Declare mutiple variables on the same line with types in Go

以上就是《Golang有类似C++的decltype的东西吗?》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>