Go语言中所有参数传递都是值传递,但slice、map、channel等类型因内部含指针而“表现得像引用传递”;若需修改原变量本身,则必须显式传指针。
Go语言中没有传统意义上的“引用传递”,所有参数传递都是值传递,但是否“表现得像引用传递”,取决于你传的是什么类型——关键在底层数据结构是否包含指针。
函数调用时,Go会把实参的值完整拷贝一份给形参。后续对形参的修改,不影响原始变量。
不是语言支持引用传递,而是这些类
型内部封装了指针:
例如:func modifySlice(s []int) { s[0] = 999 } —— 调用后原slice首元素确实变了,但s = append(s, 1)不会影响外部,因为append可能造成底层数组扩容,s会指向新地址。
当需要修改变量本身的值(比如改变一个int的数值、替换一个struct字段、或让函数分配新内存并返回地址),必须显式传指针:
例如:func increment(x *int) { *x++ };调用 increment(&a) 后,a 的值才会增加。
Go始终值传递。区别只在于:你传的是纯数据(如 int),还是带指针的“句柄”(如 slice)。理解底层结构(比如 slice 是 struct{ptr *T, len, cap}),比背概念更可靠。
基本上就这些。