go - 当它可能是 net.UDPAddr 或 net.TCPAddr 时如何从 net.Addr 获取 IP 和端口

标签 go

我正在运行一个同时监听 TCP 和 UDP 的混合服务器,并且需要获取本地端口、远程 IP 地址和远程端口。目前我检查底层类型是 net.UDPAddr 还是 net.TCPAddr 的方式如下:

// BAD: but not sure a better way
switch reflect.TypeOf(remoteAddr).String() {
case "*net.UDPAddr":
    p.SrcIP = remoteAddr.(*net.UDPAddr).IP.String()
    p.SrcPort = uint(remoteAddr.(*net.UDPAddr).Port)
    p.DstPort = uint(localAddr.(*net.UDPAddr).Port)
case "*net.TCPAddr":
    p.SrcIP = remoteAddr.(*net.TCPAddr).IP.String()
    p.SrcPort = uint(remoteAddr.(*net.TCPAddr).Port)
    p.DstPort = uint(localAddr.(*net.TCPAddr).Port)
}

我不是这个的最大粉丝,如果有人有任何看起来更干净的解决方案,我将不胜感激

最佳答案

无需反射,只需进行适当的类型断言切换即可:

switch addr := remoteAddr.(type) {
case *net.UDPAddr:
    p.SrcIP = addr.IP.String()
    p.SrcPort = uint(addr.Port)
    p.DstPort = uint(localAddr.(*net.UDPAddr).Port)
case *net.TCPAddr:
    p.SrcIP = addr.IP.String()
    p.SrcPort = uint(addr.Port)
    p.DstPort = uint(localAddr.(*net.TCPAddr).Port)
}

关于go - 当它可能是 net.UDPAddr 或 net.TCPAddr 时如何从 net.Addr 获取 IP 和端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50428176/

相关文章:

go - 单个 defer func() 可以被其他函数共享吗?

go - 为什么 GoLang 方法给出编译错误?

pointers - 在Go中返回时C struct为零

string - 修复了 byte slice 到字符串的转换——忽略空值

go - golang 字节数组的大小

go - 连接到 Click to Deploy Cassandra 实例的问题

Golang VSCode 如何停止/暂停自动导入?

go - path.Match 和 filepath.Match 有什么区别?

go - 执行大量 I/O 的 go 程序崩溃

Golang 根据属性获取项目 手机 dynamodb