golang值类型和指针在函数传参中的差异

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

golang值类型和指针在函数传参中的差异

go语言中,函数传参时使用值类型和指针类型有明显的行为差异,主要体现在数据是否被复制以及函数内部能否修改原始数据上。

值类型传参:传递的是副本

当把一个值类型变量(如 int、float64、struct 等)作为参数传入函数时,Go会创建该值的一个副本。函数内部对参数的修改不会影响原始变量。

例如:

golang值类型和指针在函数传参中的差异

协和·太初

国内首个针对罕见病领域的AI大模型

golang值类型和指针在函数传参中的差异38

查看详情 golang值类型和指针在函数传参中的差异

func modifyValue(x int) {
  x = 100
}

func main() {
  a := 10
  modifyValue(a)
  fmt.Println(a) // 输出 10,未改变 }

这里 xa 的副本,修改 x 不会影响 a

立即学习go语言免费学习笔记(深入)”;

指针类型传参:传递的是地址

如果函数参数是指针类型,传入的是变量的内存地址。函数内部可以通过解引用修改原始变量的值。

例如:

golang值类型和指针在函数传参中的差异

协和·太初

国内首个针对罕见病领域的AI大模型

golang值类型和指针在函数传参中的差异38

查看详情 golang值类型和指针在函数传参中的差异

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语言 值传递 对象

上一篇
下一篇
text=ZqhQzanResources