跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 一个 go 问题请教
未分類
17 10 月 2020

一个 go 问题请教

一个 go 问题请教

資深大佬 : momowei 2

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("%pn", &img1)    if img1.Type2 == 1 {    imgList[i].Imgpath = CacheFactory.Create().GetSysConfgiByCode("sysconfig_local_imgserver") + "/" + img1.Imgpath   }   fmt.Printf("%pn", &imgList[i])  }  return imgList } 

输出

0xc0003f18b0 0xc0003f1860 

我这里用的不是 range 遍历, img1 := imgList[i] 这也是值拷贝吗? 为啥输出的指针地址不一样呀

大佬有話說 (10)

  • 資深大佬 : ArJun

    img1 := 是重新创建值,imgList[i]这个是修改, 你用 imgList[i] = 就可以了

  • 資深大佬 : JeromeCui

    是的,值拷贝。
    var imgList []model.CommonImg 这个地方可以改成 var imgList []*model.CommonImg,之后每个元素就是一个指针了

  • 資深大佬 : lcc142625

    对的,上的意思,你得改成 var imgList []*model.CommonImg,不然你的后面 img1 := 是重新赋值,地址当然不一样了

  • 資深大佬 : tutuk5

    这个是值类型,值类型都是创建一个新的内存,只有引用类型才是创建一个指针。

  • 資深大佬 : qysz

    img1 定义在 for 循环外面试试,循环内不要用 := 。

  • 主 資深大佬 : momowei

    @JeromeCui 我以为只有 range 才是值拷贝列,这个语义跟 java 还是蛮大区别

  • 資深大佬 : 0xWalker

    img1 是临时变量的地址

  • 資深大佬 : di1012

    img1 := imgList[i]
    等价于
    var img1 model.CommonImg
    img1=imgList[i]

    &img1 取的是新创建的变量的地址

  • 資深大佬 : mcfog

    不同于其他语言,golang 永远都是值拷贝,值传参,没有例外。指针是单纯的(值)类型,“引用”只是“解指针”动作的效果

  • 資深大佬 : sunny352787

    记住 go 里面所有东西都是值,想改用指针

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具