修复代码,和map的使用有关,只是在struct中应用时候需要注意,详情可以参考《GO语言设计与实现》
基本原因:
一般来说,使用range遍历map的索引和元素时,会额外创建新的一片内存空间存储切片中的元素,循环中每一次迭代都会被重新赋值而被覆盖,赋值时也会触发复制,因为循环中获取返回变量的地址都完全一样,所以会发生神奇的"指针现象",不应该使用&i2,要么使用&i2[index],或者使用一个临时变量存储s := i2,然后使用&s。
package app
import (
"fmt"
"strconv"
)
type (
Strc struct {
id int
info *Tmp
}
Tmp struct {
id int
name string
dec string
}
)
func DDD() {
var stc = make([]*Strc, 0)
var pr []Strc
for i := 0; i < 5; i++ {
var data = Strc{
id: i,
info: &Tmp{
id: i + 1,
name: "test",
dec: strconv.Itoa(i+1) + "test",
},
}
pr = append(pr, data)
}
for _, i2 := range pr {
s := i2 //核心在这里
stc = append(stc, &s)
}
for i, s := range stc {
fmt.Println(i, "--", s.info.id)
}
}
结果:
0 -- 1
1 -- 2
2 -- 3
3 -- 4
4 -- 5