我是靠谱客的博主 俏皮外套,最近开发中收集的这篇文章主要介绍go踩坑指南:修改slice里的struct类型的元素不生效?show the codeslice的元素内容被修改了吗?采坑指南,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
go踩坑指南:修改slice里的struct类型的元素不生效?
- show the code
- slice的元素内容被修改了吗?
- 执行A,也即modSliceIndex函数,元素内容被修改
- 执行B,也即modSlice函数,元素内容没有被修改
- 采坑指南
- 值传递
- slice数据类型,包含指向底层数组的指针
- range的原理
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=%+vn", s)
modSliceIndex(s)
//modSlice(s)
fmt.Printf("modified=%+vn", 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里元素的内容,所以最终元素没有被修改。
最后
以上就是俏皮外套为你收集整理的go踩坑指南:修改slice里的struct类型的元素不生效?show the codeslice的元素内容被修改了吗?采坑指南的全部内容,希望文章能够帮你解决go踩坑指南:修改slice里的struct类型的元素不生效?show the codeslice的元素内容被修改了吗?采坑指南所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复