在自定义类型中包装net.IP并在golang中添加方法

时间:2015-04-20 15:05:43

标签: go

我尝试将方法添加到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)
    }
}

有些事情在这里不起作用:

  • 来自net.IP的方法To4()对于IPAddr(第27行)
  • 是未知的
  • len()不适用于IPAddr,但适用于net.IP(第30行)
  • 字符串无法解组到IPAddr,这适用于net.IP(第12行)

我的类型定义显然是错误的...任何提示?

参见示例: http://play.golang.org/p/BT7VFnbPZW

2 个答案:

答案 0 :(得分:6)

不在类型之间继承方法(Go根本没有继承)。

您可能需要embed类型,如果您自动宣传这些方法,那么

type IPAddr struct {
    net.IP
}

答案 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中的所有方法。