当附加到切片结构体时,在结构体中重写指针值



我今天一直在处理一个奇怪的问题。

所以,我一直试图从映射中获取值,并分配给结构类型变量的切片。但不知何故,struct键中的指针值被重写了,不知道为什么。我已经编写了一个示例代码来演示这个问题。

package main
import "fmt"
type PType []struct {
Main  string
PVals *[]string
}
var mkey = map[string][]string{
"xpos": {"123", "234", "543"},
"ypos": {"-12", "9", "0"},
}
func main() {
var db PType
for mval, pval := range mkey {
db = append(db, struct {
Main  string
PVals *[]string
}{
Main:  mval,
PVals: &pval,
})
}
for _, x := range db {
fmt.Printf("Main: %+v | PVal: %+vn", x.Main, x.PVals)
}
}

结构体db中键PVals的值在内存中以某种方式被覆盖,导致输出:

Main: xpos | PVal: &[-12 9 0]
Main: ypos | PVal: &[-12 9 0]

…理想情况下应该是

Main: xpos | PVal: &[123 234 543]
Main: ypos | PVal: &[-12 9 0]

如果我将PType.PVals的类型从*[]string更改为[]string,问题就会解决。

我保存指针做错了什么?

如果有帮助,这里有一个游乐场链接:https://play.golang.org/p/IVOUfTvoLt6

for循环中,循环变量的地址是固定的。每次迭代都会重写循环变量。当您在映射中添加循环变量的地址时,您添加的是在每次迭代中被覆盖的相同切片。因此,最终得到的映射的值都指向相同的位置。

如果没有指针,则在map中放置循环变量的副本。

相关内容

  • 没有找到相关文章

最新更新