func (srv *sysCommonSrv) ListCommongImg() []model.CommonImg {
var imgList []model.CommonImg
err := Db.Find(&imgList).Error
if nil != err {
return make([]model.CommonImg, 0)
}
i := 0
for ; i < len(imgList); i++ {
img1 := imgList[i]
fmt.Printf("%p\n", &img1)
if img1.Type2 == 1 {
imgList[i].Imgpath = CacheFactory.Create().GetSysConfgiByCode("sysconfig_local_imgserver") + "/" + img1.Imgpath
}
fmt.Printf("%p\n", &imgList[i])
}
return imgList
}
输出
0xc0003f18b0
0xc0003f1860
我这里用的不是 range 遍历, img1 := imgList[i] 这也是值拷贝吗? 为啥输出的指针地址不一样呀
1
ArJun 2020-10-21 09:14:52 +08:00
img1 := 是重新创建值,imgList[i]这个是修改, 你用 imgList[i] = 就可以了
|
2
JeromeCui 2020-10-21 09:17:00 +08:00
是的,值拷贝。
var imgList []model.CommonImg 这个地方可以改成 var imgList []*model.CommonImg,之后每个元素就是一个指针了 |
3
lcc142625 2020-10-21 09:18:27 +08:00
对的,楼上的意思,你得改成 var imgList []*model.CommonImg,不然你的后面 img1 := 是重新赋值,地址当然不一样了
|
4
tutuk5 2020-10-21 09:25:16 +08:00
这个是值类型,值类型都是创建一个新的内存,只有引用类型才是创建一个指针。
|
5
qysz 2020-10-21 09:25:57 +08:00
img1 定义在 for 循环外面试试,循环内不要用 := 。
|
7
0xWalker 2020-10-21 09:32:15 +08:00 via iPhone
img1 是临时变量的地址
|
8
di1012 2020-10-21 11:44:37 +08:00
img1 := imgList[i]
等价于 var img1 model.CommonImg img1=imgList[i] &img1 取的是新创建的变量的地址 |
9
mcfog 2020-10-21 12:11:14 +08:00 via Android
不同于其他语言,golang 永远都是值拷贝,值传参,没有例外。指针是单纯的(值)类型,“引用”只是“解指针”动作的效果
|
10
sunny352787 2020-10-21 12:23:53 +08:00
记住 go 里面所有东西都是值,想改用指针
|