Go语言函数修改参数为何有的生效有的不生效?
Go两种传参修改结果差异的原因
Go语言所有函数参数均为值传递,两种示例的表现差异源于传递的参数类型本质不同:
结构体传参未生效的原因
- 第一个示例中
changeName接收Person结构体类型参数,属于值类型。调用changeName(person)时,会完整拷贝原始person结构体生成独立副本传入函数 - 函数内修改
p.firstName的操作作用于副本,完全不影响原始person变量,因此最终输出{Alice Dow},结构体未被修改。
切片传参修改生效的原因
- 切片是Go的引用类型,其底层结构由三个字段组成:指向底层数组的指针、切片长度、切片容量
- 调用
updateSlice(slice)时同样做了值拷贝,但拷贝的是切片本身的结构,副本和原始切片持有的底层数组指针指向同一块内存空间 - 函数内
slice[0] = "x"的操作实际修改的是共同的底层数组的值,因此原始切片读取时也会拿到修改后的值,最终输出[x b c]。
内容的提问来源于stack exchange,提问作者mr_yoda
相关产品推荐
相关产品推荐

