英文:
Wrap net.IP in a custom type and add methodes in golang
问题
我尝试为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)
}
}
这里有一些不起作用的地方:
- IPAddr类型不知道net.IP的To4()方法(第27行)
- IPAddr类型不能使用len()方法,但net.IP类型可以(第30行)
- 无法将字符串解组为IPAddr类型,但可以解组为net.IP类型(第12行)
我的类型定义显然是错误的...有什么提示吗?
请参考示例:
http://play.golang.org/p/BT7VFnbPZW
英文:
I try to add methodes to net.IP. Therefore I created a custom type 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)
}
}
Some things that do not work here:
- Method To4() from net.IP is not known for IPAddr (line 27)
- len() does not work for IPAddr but for net.IP (line 30)
- string cannot be unmarshalled to IPAddr, this works for net.IP (line 12)
My type definition is obviously wrong... any hints?
See example at:
http://play.golang.org/p/BT7VFnbPZW
答案1
得分: 6
方法在类型之间不会被继承(Go语言根本没有继承)。
如果你想自动提升方法,你可以考虑嵌入该类型:
type IPAddr struct {
net.IP
}
英文:
Methods are not inherited between types (Go does not have inheritance at all).
You may want to embed the type, if promoting the methods automatically is what you're after:
type IPAddr struct {
net.IP
}
答案2
得分: 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
的所有方法。
英文:
Convert to net.IP
before trying to call methods, otherwise you'll call methods on the wrapper:
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
}
For unmarshaling, implement the json.Unmarshaler
interface.
Another way to do it is by embedding net.IP
in a struct, although this will inherit all methods from net.IP
.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论