我今天一直在处理一个奇怪的问题。
所以,我一直试图从映射中获取值,并分配给结构类型变量的切片。但不知何故,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中放置循环变量的副本。