C++有decltype(expr)个.可以声明其他表达式类型的对象.例如:

conn, err := net.ListenUDP("udp", udp_addr)
...
defer conn.Close()
...
_, err = conn.WriteToUDP(data, addr)

重要的是,我知道我能用函数的(类型)结果do得到什么(在本例中,用连接,结果是ListenUDP),但我不知道这是什么类型is.这里,因为Go的类型推断,我不需要知道.但是如果我想创建5个连接,那么我想要一个由5个"ListenUDP个结果"组成的array.我做不到.最接近我的是:

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没有相当于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.还要注意的是,在围棋中使用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上try ):

[0xc00000e058 <nil> <nil> <nil>]

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

Go相关问答推荐

为什么在GO中打印变量会导致堆栈溢出?

使用一元或服务器流将切片从GRPC服务器返回到客户端

Go Colly-访问for循环中的URL

Go源在Goland(IDEA)中以灰色显示.什么意思?我怎么才能让它恢复正常?

如何在v2 Go SDK中使用KeyConditionExpression查询AWS DynamoDb?

提供的client_secret与此帐户上任何关联的SetupIntent都不匹配

可以';t从主机连接到ScyllaDB容器

nixOS 上的 Nginx 反向代理在try 加载 css/js 时返回 404

如何在正则表达式中使整个单词可选?

为什么我只收到部分错误而不是我启动的 goroutines 的所有错误?

go version -m 输出中的箭头符号=>是什么意思?

go-echo中如何防止+转义

通过环境变量配置 OTLP 导出器

转到文本/模板模板:如何根据模板本身的值数组判断值?

跟踪长时间运行的任务的进度 - 正确的方法

Golang SSH客户端错误无法验证,try 的方法[无公钥],没有支持的方法

Go 使用 struct 作为接口而不实现所有方法

手动将 OpenTelemetry 上下文从 golang 提取到字符串中?

如何断言类型是指向golang中接口的指针

如何使用 fyne 避免 GUI 应用程序中的循环依赖?