Go中所有参数传递均为值传递,但通过指针可实现类似引用传递的效果;指针参数允许函数修改原始变量,结构体指针避免大对象复制并支持原地修改,适用于需修改外部变量、提升性能或处理nil状态等场景。

在Go语言中,所有参数传递都是值传递,但通过指针可以实现类似“引用传递”的效果。理解指针参数和结构体指针的用法,是掌握Go中数据共享和修改的关键。
指针参数实现“引用传递”
虽然Go不支持真正的引用传递,但使用指针可以让函数操作原始变量,而不是副本。
例如:func modifyValue(x *int) {
*x = 100
}
func main() {
a := 42
modifyValue(&a)
fmt.Println(a) // 输出 100
}
这里 &a 取地址传入,函数内通过 *x 解引用修改原值,看起来就像引用传递。
结构体指针提升性能与可变性
对于大结构体,直接传值会复制整个对象,效率低。使用结构体指针避免复制,同时允许函数修改原结构体。
立即学习“go语言免费学习笔记(深入)”;
type Person struct {
Name string
Age int
}
func updatePerson(p *Person) {
p.Age += 1
}
func main() {
person := &Person{Name: "Alice", Age: 25}
updatePerson(person)
fmt.Printf("%+v\n", person) // &{Name:Alice Age:26}
}
即使不显式取地址,Go也允许通过指针调用方法或访问字段(自动解引用)。
何时使用指针参数
以下情况推荐使用指针:
- 需要修改函数外的变量
- 结构体较大,避免复制开销
- 希望保持一致性,比如方法接收者混用值和指针容易出错
- nil 是合法状态,如表示“无对象”
注意:基础类型如 int、string 等小对象,除非需要修改,否则传值更安全直观。
基本上就这些。Go的设计鼓励清晰和安全,指针用得当,既能模拟引用语义,又不会失去控制。










