首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >go踩坑指南:修改slice里的struct类型的元素不生效?

go踩坑指南:修改slice里的struct类型的元素不生效?

作者头像
hugo_lei
修改2021-11-08 15:28:27
1.3K0
修改2021-11-08 15:28:27
举报

go踩坑指南:修改slice里的struct类型的元素不生效?

show the code

import "fmt"

type MyS struct {
	name string
}

func MySliceModify() {
	s := make([]MyS, 0)
	s = append(s, MyS{name: "1"})
	fmt.Printf("origin=%+v\n", s)
	modSliceIndex(s)
	//modSlice(s)
	fmt.Printf("modified=%+v\n", s)
}

func modSliceIndex(s []MyS) {
	for i, _ := range s {
		s[i].name = "2"
	}
}

func modSlice(s []MyS) {
	for _, i := range s {
		i.name = "haha"
	}
}

slice的元素内容被修改了吗?

执行A,也即modSliceIndex函数,元素内容被修改

origin=[{name:1}] modified=[{name:2}]

执行B,也即modSlice函数,元素内容没有被修改

origin=[{name:1}] modified=[{name:1}]

采坑指南

值传递

go的参数传递都是值传递。

slice数据类型,包含指向底层数组的指针

slice数据结构里,包含指向底层array的指针。slice作为参数传递时,实际是创建了一个新的slice对应,同时将原slice对应的array指针copy过来,但因为是指针,所以新创建的slice对象还是指向了原来的底层array。

range的原理

for i,element := range someslice {
}

这里i是下标,是索引, element是个具体的对象,并且在for循环的过程中,element被循环地赋值了当前的元素。

s[i].name = “2” 与 element.name = “haha” 的区别: s[i] 其实是指向元素的指针,所以这里实质是通过元素的指针,修改了元素的内容,当然最终元素被修改了。 element是个MyS类型的对象,这里其实是把第i的元素的具体内容,copy到element了。修改element.name,只是修改了element对象的内容,并没有修改slice里元素的内容,所以最终元素没有被修改。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-07-01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • go踩坑指南:修改slice里的struct类型的元素不生效?
  • show the code
  • slice的元素内容被修改了吗?
    • 执行A,也即modSliceIndex函数,元素内容被修改
      • 执行B,也即modSlice函数,元素内容没有被修改
      • 采坑指南
        • 值传递
          • slice数据类型,包含指向底层数组的指针
            • range的原理
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档