问题描述:
在某项目代码中,由于避免golang中的零值问题,在定义结构体时,将某字段的类型定义为了指针(*uint8),在后续操作中需要生成结构体切片返回,然后在for range中对slice进行append地址操作时,发现slice中的值全部一样且为for range中的最后一个。简化代码如下:
结果如下
总结原因
最终总结出原因是在for range语句中,创建了变量num且只被创建了一次。即num有自己的空间内存且地址在for循环过程中不变,循环过程中每次将nums中对应的值和num进行值传递。
解决方法
目前个人觉得最优的解决方法是,不使用for range的形式,直接用索引来取值。
结果如下
特别注意
需要注意的是,新旧两个切片数据指向的内存地址一样,所以改变其中一个切片数据,另一个也会随之变化。