在Golang复制net.IP

时间:2015-04-19 15:53:36

标签: go

我尝试复制net.IP实例的值(第14行和第19行)但显然只是绕过指针:

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

我做错了什么?

按要求提供代码:

package main

import (
    "log"
    "net"
)

type Range struct {
    Start net.IP `json:"start"`
    End   net.IP `json:"end"`
}

func (r Range) Expand() []net.IP {
    next := r.Start // here (line 14)
    out := []net.IP{next}

    for !next.Equal(r.End) {
        incIP(next)
        out = append(out, next) // and here (line 19)
    }

    return out
}

func incIP(ip net.IP) {
    for j := len(ip) - 1; j >= 0; j-- {
        ip[j]++
        if ip[j] > 0 {
            break
        }
    }
}

func main() {
    r := Range{
        Start: net.ParseIP("192.100.10.4"),
        End:   net.ParseIP("192.100.13.1"),
    }
    out := r.Expand()
    log.Print(r)
    log.Print(out)
}

1 个答案:

答案 0 :(得分:4)

看看documentation for net.IP;它只是一个[]byte,因此您可以使用copy builtin

E.g:

func dupIP(ip net.IP) net.IP {
    dup := make(net.IP, len(ip))
    copy(dup, ip)
    return dup
}

如果您关心空间,您还可以从文档中注意到,虽然所有net例程都支持net.IP长度为4(例如ip := net.IP([]byte{1, 2, 3, 4}),但所有它们生成的是16个字节。既然你做了很多,如果你关心几个字节的空间,或者如果你关心255.255.255.255之后会发生什么,你可以像这样对IPv4避免这种情况:

func dupIP(ip net.IP) net.IP {
    // To save space, try and only use 4 bytes
    if x := ip.To4(); x != nil {
        ip = x
    }
    dup := make(net.IP, len(ip))
    copy(dup, ip)
    return dup
}

你可能想要为IPv6地址做一些不同的事情,我认为以你的方式“增加”IPv6是没有意义的,但我可能错了。

原版的修改版本: https://play.golang.org/p/GP9vASvUgh