在Golang中,net.IP作为map的键类型可以使用吗?

9

我有一个以net.IP为键,通道为值的映射。 但是我遇到了一个奇怪的编译错误(无效的映射键类型)。

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作为地图键类型吗?
2个回答

9

net.IP 是一个切片类型。因为切片是可变的,所以不能将其用作映射键。请使用字符串作为键类型:

MapOfValues map[string]chan string

使用类型转换从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.Stringnet.ParseIP函数进行转换:
x.MapOfValues[ip.String()] = v

for k, v := range x.MapOfValues {
   ip := net.ParseIP(k) 
   ...
}

5
从 Go 1.18 开始,你现在可以直接将 netip.Addr 用作 map 键。这种新的 IP 类型的声明意图之一就是支持 ==!= 运算符,从而允许其用作 map 键。

Addr 表示一个 IPv4 或 IPv6 地址(带有或不带有范围地址区域),类似于 net.IP 或 net.IPAddr。

与 net.IP 或 net.IPAddr 不同的是,Addr 是可比较的值类型(支持 == 并且可以是 map 键)并且是不可变的。

所以现在你可以将你的结构体字段声明为:
MapOfValues map[netip.Addr]chan string

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接