gpt4 book ai didi

go - 使用递增函数填充结构图

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

我正在尝试使用字符串键和指向结构值的指针来填充映射。具体来说,在填充一个字段时出现问题,需要通过调用函数在另一个数组的范围内递增。 Problem snippet is here .

package main

import (
"fmt"
"net"
)

type bgp struct {
tag net.IP
}

type nbrStruct struct {
bgp
}

var mIPStr = "10.10.10.0"

func main() {
m := make(map[string]*nbrStruct)
s := []string{"string1", "string2"}
mIP := net.ParseIP(mIPStr)
mIP = mIP.To4()

for _, v := range s {
m[v] = &nbrStruct{
bgp: bgp{
tag: mIP,
},
}
fmt.Println(mIP)
mIP, _ = NextIP(mIP, 4)
}
for key, value := range m {
fmt.Printf("key: %v ---> tag: %v\n", key, value.bgp.tag)
}
}

func NextIP(ip net.IP, addIP int) (net.IP, error) {
var err error
if ip = ip.To4(); ip != nil {
// Case IPv4
ip[3] = ip[3] + uint8(addIP)
if ip[3] > 255 {
ip[3] = ip[3] - 255
ip[2]++
}
if ip[2] > 255 {
ip[2] = ip[2] - 255
ip[1]++
}
if ip[1] > 255 {
err = fmt.Errorf("NextIP out of space in top IPv4 Octet %v", ip)
return nil, err
}
// } else if ip = ip.To16(); ip != nil {
// // Case IPv6
} else {
err = fmt.Errorf("NextIP cannot understand IP: %v", ip)
return nil, err
}
return ip, err
}

我遇到的问题是第 31 行

mIP, _ = NextIP(mIP, 4)

我希望这两个值是:

m["string1"].bgp.tag == 10.10.10.0
m["string2"].bgp.tag == 10.10.10.4

...NextIP 函数正确返回。但是看 map ,之前的m["string1"].bgp.tag值好像被新的覆盖了?他们都是 10.10.10.8;对此非常困惑。我做错了什么?

最佳答案

net.IP是一个 byte slice 。

您基本上是在不断地修改 mIP 并存储它。但是由于方式slices work ,您实际上是在存储指向基础数据的指针。

您的问题的快速解决方法是存储 mIP 的副本。例如:

for _, v := range s {
tmpIP := make([]byte, len(mIP))
copy(tmpIP, mIP)
m[v] = &nbrStruct{
bgp: bgp{
tag: tmpIP,
},
}

mIP, _ = NextIP(mIP, 4)
}

这会产生正确的输出:

key: string1 ---> tag: 10.10.10.0
key: string2 ---> tag: 10.10.10.4

我强烈建议您更改 NextIP 以返回新 IP,而不是输入的修改版本。

关于go - 使用递增函数填充结构图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48126879/

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