值类型传参复制数据,函数内修改不影响原值;指针类型传参传递地址,可修改原始变量。例如,int值传递不改变原值,而int通过x=100可更新原变量。结构体较大时,指针传递避免复制开销并支持字段修改,如Person结构体使用指针参数提升效率与可变性。选择依据为是否需修改原值及数据大小,注意避免指针滥用导致意外修改。

在go语言中,函数传参时使用值类型和指针类型有明显的行为差异,主要体现在数据是否被复制以及函数内部能否修改原始数据上。
值类型传参:传递的是副本
当把一个值类型变量(如 int、float64、struct 等)作为参数传入函数时,Go会创建该值的一个副本。函数内部对参数的修改不会影响原始变量。
例如:
func modifyValue(x int) {
x = 100
}
func main() {
a := 10
modifyValue(a)
fmt.Println(a) // 输出 10,未改变 }
这里 x 是 a 的副本,修改 x 不会影响 a。
立即学习“go语言免费学习笔记(深入)”;
指针类型传参:传递的是地址
如果函数参数是指针类型,传入的是变量的内存地址。函数内部可以通过解引用修改原始变量的值。
例如:
func modifyPointer(x *int) {
*x = 100
}
func main() {
a := 10
modifyPointer(&a)
fmt.Println(a) // 输出 100,已被修改 }
这里 *x = 100 修改了 a 指向的内存位置的值,因此原始变量被更新。
结构体场景中的性能与可变性考虑
对于大型结构体,值传递会导致整个结构体被复制,开销较大。使用指针传递更高效,且能统一处理可变性。
比如:
type Person struct {
Name string
Age int
}
func updatePerson(p *Person) {
p.Age += 1
}
func main() {
person := Person{Name: “Tom”, Age: 25}
updatePerson(&person)
fmt.Println(person) // {Tom 26} }
使用指针不仅避免了复制大对象,还能直接修改原结构体字段。
基本上就这些。值传递安全但可能低效,指针传递高效且支持修改原值,选择取决于是否需要修改和数据大小。注意合理使用,避免不必要的指针暴露导致意外修改。不复杂但容易忽略细节。
go golang go语言 ai golang String 结构体 int 指针 值类型 指针类型 Struct Go语言 值传递 对象


