Golang中值类型和指针类型在函数调用时的区别 解析Golang函数调用时的类型处理

go语言中,函数调用时值类型传递副本,不影响原数据;指针类型传递地址,可直接修改原始数据。值类型作为参数传入函数时,操作的是原始数据的拷贝,对原数据无影响,如modifyvalue函数中修改a不影响外部x;指针类型传参时,函数通过解引用操作可改变原数据,如modifypointer通过传入x的地址修改了其值;对于结构体,若需修改原数据、结构体较大、包含资源句柄或需共享状态,则优先使用指针类型;反之,若无需修改原数据且结构体较小,可用值类型。

Golang中值类型和指针类型在函数调用时的区别 解析Golang函数调用时的类型处理

golang中,函数调用时值类型和指针类型的处理方式是不一样的。简单来说:值类型传递的是副本,而指针类型传递的是地址。这就导致了在函数内部对参数的修改是否会影响原数据的区别

Golang中值类型和指针类型在函数调用时的区别 解析Golang函数调用时的类型处理


值类型传参:函数操作不影响原数据

当你把一个值类型变量作为参数传入函数时,Go会复制这个变量的值到函数内部。也就是说,函数里操作的是原始数据的一个“拷贝”。

Golang中值类型和指针类型在函数调用时的区别 解析Golang函数调用时的类型处理

举个例子:

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

func modifyValue(a int) {     a = 100 }  func main() {     x := 10     modifyValue(x)     fmt.Println(x) // 输出还是 10 }

在这个例子中,

x

的值被复制给了函数中的

a

。即使函数内部将

a

改成了100,外部的

x

仍然没有变化。

Golang中值类型和指针类型在函数调用时的区别 解析Golang函数调用时的类型处理

所以如果你希望函数能修改原始变量的内容,就不能只传值类型。


指针类型传参:可以修改原始数据

与值类型不同,使用指针类型传参时,函数接收到的是变量的内存地址。这样它就能直接操作原始数据了。

看个对比的例子:

func modifyPointer(a *int) {     *a = 100 }  func main() {     x := 10     modifyPointer(&x)     fmt.Println(x) // 输出变成 100 }

这里我们传的是

x

的地址,函数内通过解引用修改了它的值。这种方式适合需要在函数中改变原始变量的情况。

小贴士:如果你传的是结构体,尽量用指针类型传参,避免不必要的内存复制。结构体比较小的时候,传值也无所谓;但大的结构体传值性能开销会明显增加。


什么时候该用值类型?什么时候用指针?

这个问题其实挺常见的,总结一下几个判断依据:

  • 不需要修改原数据 → 用值类型
  • 需要修改原数据 → 用指针类型
  • 结构体较大或包含资源句柄(如文件、网络连接) → 优先用指针
  • 想让对象具有唯一性或共享状态 → 用指针更合适

比如定义一个结构体方法时:

type User struct {     Name string }  // 用指针接收者的方法可以修改结构体本身 func (u *User) ChangeName(name string) {     u.Name = name }

这样调用后,原始的User对象会被修改。如果是值接收者,则只是改了副本。


基本上就这些。理解值类型和指针类型在函数调用时的行为差异,对于写好Go程序非常重要。别看这东西基础,但在实际开发中一不小心就容易踩坑。

以上就是Golang中值类型和指针类型在函数调用时的

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享