我使用key作为net.IP和value作为通道映射。 但我得到一个奇怪的编译时错误(无效的地图密钥类型)
17 type UdpServer struct {
18 ListenPort int
19
20 ConnRef *net.UDPConn
21 Log_ref *Logger
22 MapOfValues map[net.IP]chan string
23 }
$ go build c-manager.go
cmanager/c-udp_server.go:22:14: invalid map key type net.IP
$ go version
go version go1.10.2 linux/amd64
我做错了什么?我们不能将net.IP作为地图密钥类型吗?
答案 0 :(得分:4)
net.IP是切片类型。因为切片是可变的,所以它们不能用作映射键。使用字符串作为键类型:
MapOfValues map[string]chan string
使用type conversion将net.IP转换为字符串并返回。使用IP.To16将地址规范化为16字节表示。
x.MapOfValues[string(ip.To16())] = v
for k, v := range x.MapOfValues {
ip := net.IP(k) // convert string to net.IP
...
}
如果您希望密钥可打印,请使用IP.String和net.ParseIP功能进行转换:
x.MapOfValues[ip.String()] = v
for k, v := range x.MapOfValues {
ip := net.ParseIP(k)
...
}