修复代码,和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