我尝试复制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)
}
答案 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