高郎撒了一根绳子到网里.IPNet类型



我有一个以CIDR符号表示的字符串切片。它们都是ipv4和ipv6,我需要将它们转换为net.IPNet类型。

我如何在golang中做到这一点?

字符串示例:

192.168.1.1/24
fd04:3e42:4a4e: 3381: 64:/

如cnicutar所说,使用net.ParseCIDR

这是一个关于如何实际使用它的工作示例。

http://play.golang.org/p/Wtqy56LS2Y

package main
import (
    "fmt"
    "net"
)
func main() {
    ipList := []string{"192.168.1.1/24", "fd04:3e42:4a4e:3381::/64"}
    for i := 0; i < len(ipList); i += 1 {
        ip, ipnet, err := net.ParseCIDR(ipList[i])
        if err != nil {
            fmt.Println("Error", ipList[i], err)
            continue
        }
        fmt.Println(ipList[i], "-> ip:", ip, " net:", ipnet)
    }
}

我认为你不需要cast;相反,我认为你需要ParseCIDR

func ParseCIDR(s string) (IP, *IPNet, error)

这就是使用IPAddress Go库的方法。CIDR子网、IP地址和掩码都使用IPAddress库ipaddr.IPAddress中的相同类型,使代码更简单。免责声明:我是项目经理。

package main
import (
    "fmt"
    "github.com/seancfoley/ipaddress-go/ipaddr"
    "net"
)
func main() {
    parseAddr("192.168.1.1/24")
    parseAddr("fd04:3e42:4a4e:3381::/64")
}
func parseAddr(cidrStr string) {
    cidr := ipaddr.NewIPAddressString(cidrStr)
    subnet, addr := cidr.GetAddress().ToPrefixBlock(), cidr.GetHostAddress()
    var ipNet = net.IPNet{
        IP:   subnet.GetNetIP(),
        Mask: subnet.GetNetworkMask().Bytes(),
    }
    fmt.Printf("nsubnet: %snaddress: %snIPNet: %+vn", subnet, addr, ipNet)
}
输出:

subnet: 192.168.1.0/24
address: 192.168.1.1
IPNet: {IP:192.168.1.0 Mask:ffffff00}
subnet: fd04:3e42:4a4e:3381::/64
address: fd04:3e42:4a4e:3381::
IPNet: {IP:fd04:3e42:4a4e:3381:: Mask:ffffffffffffffff0000000000000000}

最新更新