我尝试将方法添加到net.IP.因此我创建了一个自定义类型IPAddr:
package main
import (
"encoding/json"
"net"
"log"
)
func readNetworks(data []byte) (*[]Network, error) {
var networks []Network
if err := json.Unmarshal(data, &networks); err != nil {
return &networks, err
}
return &networks, nil
}
type IPAddr net.IP
type Network struct {
CIDR string `json:"cidr"`
Gateway IPAddr `json:"gateway"`
}
func (ip *IPAddr) copy() IPAddr {
if x := ip.To4(); x != nil {
ip = x
}
dup := make(IPAddr, len(ip))
copy(dup, ip)
return dup
}
func main() {
_, err := readNetworks([]byte("[{\"cidr\":\"10.100.19.0/24\",\"gateway\":\"10.100.19.1\"}]"))
if err != nil {
log.Fatal(err)
}
}
有些事情在这里不起作用:
我的类型定义显然是错误的...任何提示?
答案 0 :(得分:6)
答案 1 :(得分:3)
在尝试调用方法之前转换为net.IP
,否则您将在包装器上调用方法:
func (ip *IPAddr) copy() IPAddr {
if x := net.IP(*ip).To4(); x != nil {
ip = x
}
dup := make(IPAddr, len(net.IP(*ip)))
copy(dup, *ip)
return dup
}
对于解组,请实施json.Unmarshaler
界面。
另一种方法是在结构中嵌入net.IP
,尽管这将继承net.IP
中的所有方法。