Go中所有参数传递均为值传递,但通过指针可实现类似引用传递的效果;指针参数允许函数修改原始变量,结构体指针避免大对象复制并支持原地修改,适用于需修改外部变量、提升性能或处理nil状态等场景。
在Go语言中,所有参数传递都是值传递,但通过指针可以实现类似“引用传递”的效果。理解指针参数和结构体指针的用法,是掌握Go中数据共享和修改的关键。
指针参数实现“引用传递”
虽然Go不支持真正的引用传递,但使用指针可以让函数操作原始变量,而不是副本。
例如:
func modifyValue(x *int) {
*x = 100
}
func main() {
a := 42
modifyValue(&a)
fmt.Println(a) // 输出 100
}
这里
取地址传入,函数内通过
解引用修改原值,看起来就像引用传递。
结构体指针提升性能与可变性
对于大结构体,直接传值会复制整个对象,效率低。使用结构体指针避免复制,同时允许函数修改原结构体。
立即学习
“
go语言免费学习笔记(深入)
”;
go语言参考手册 中文CHM版
Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。本文给大家带来Go参考手册,需要的可以来下载! Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发,后来还加入了Ian Lance Taylor, Russ Cox等人,并最终于2009年11月开源,在2012年早些时候发布了Go 1稳定版本。现在Go的开发已经是完全开放的,并且拥有一个活跃的社区。 Go 语言特色 简洁、快速、安全 并行、有趣、开源 内存管理、v数组安全、编译
下载
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 是合法状态,如表示“无对象”
注意:基础类型如
、
等小对象,除非需要修改,否则传值更安全直观。
基本上就这些。Go的设计鼓励清晰和安全,指针用得当,既能模拟引用语义,又不会失去控制。
&a*xintstring