gpt4 book ai didi

go - 在 Golang 中复制 net.IP

转载 作者:IT王子 更新时间:2023-10-29 01:02:54 27 4
gpt4 key购买 nike

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

最佳答案

查看documentation for net.IP ;它只是一个 []byte 所以你可以使用 copy builtin .

例如:

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

如果您关心空间,您还可以从文档中注意到,尽管所有 net 例程都支持长度为 4 的 net.IP(例如 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

关于go - 在 Golang 中复制 net.IP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29732128/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com