一个 go 问题请教

2020-10-21 09:04:53 +08:00
 momowei
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] 这也是值拷贝吗? 为啥输出的指针地址不一样呀

1946 次点击
所在节点    问与答
10 条回复
ArJun
2020-10-21 09:14:52 +08:00
img1 := 是重新创建值,imgList[i]这个是修改, 你用 imgList[i] = 就可以了
JeromeCui
2020-10-21 09:17:00 +08:00
是的,值拷贝。
var imgList []model.CommonImg 这个地方可以改成 var imgList []*model.CommonImg,之后每个元素就是一个指针了
lcc142625
2020-10-21 09:18:27 +08:00
对的,楼上的意思,你得改成 var imgList []*model.CommonImg,不然你的后面 img1 := 是重新赋值,地址当然不一样了
tutuk5
2020-10-21 09:25:16 +08:00
这个是值类型,值类型都是创建一个新的内存,只有引用类型才是创建一个指针。
qysz
2020-10-21 09:25:57 +08:00
img1 定义在 for 循环外面试试,循环内不要用 := 。
momowei
2020-10-21 09:28:18 +08:00
@JeromeCui 我以为只有 range 才是值拷贝列,这个语义跟 java 还是蛮大区别
0xWalker
2020-10-21 09:32:15 +08:00
img1 是临时变量的地址
di1012
2020-10-21 11:44:37 +08:00
img1 := imgList[i]
等价于
var img1 model.CommonImg
img1=imgList[i]

&img1 取的是新创建的变量的地址
mcfog
2020-10-21 12:11:14 +08:00
不同于其他语言,golang 永远都是值拷贝,值传参,没有例外。指针是单纯的(值)类型,“引用”只是“解指针”动作的效果
sunny352787
2020-10-21 12:23:53 +08:00
记住 go 里面所有东西都是值,想改用指针

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/716919

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX