我正在运行一个同时监听 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/