miller
发布于

go 传引用 传值

这是一个非常经典的 Go 问题!我们来简单系统地梳理一下 什么时候方法调用需要传入 &参数。

🎯 总原则

是否需要 & 取决于:
1. 方法(或函数)参数的类型 是 值类型(T) 还是 指针类型(*T)。
2. 你当前变量的类型 是值类型还是指针类型。
3. 你是否希望方法内部能修改原变量的值。

✅ 具体情况详解

  1. 函数参数是指针类型(*T)

你需要传入变量的地址,也就是加 &。

type User struct {
Name string
}

func updateName(u *User) {
u.Name = "Alice"
}

func main() {
u := User{}
updateName(&u) // ✅ 传入地址
}

如果你写成 updateName(u),编译会报错,因为 u 是 User,不是 *User。

  1. 方法接收者是指针类型(func (u *User) Method())时

Go 会自动帮你做一些转换:

✅ 不一定要手动加 &,Go 可以自动帮你调用。

type User struct {
Name string
}

func (u *User) SetName(name string) {
u.Name = name
}

func main() {
u := User{}
u.SetName("Alice") // ✅ ok,Go 自动转换为 &u
(&u).SetName("Bob") // ✅ 这样也行,手动加 &u
}

即使方法是 *User 接收者,Go 也能用 u.SetName() 自动转换为 (&u).SetName()。

  1. 方法接收者是值类型(func (u User) Method())

那么传值和传引用的区别就显现出来了。

func (u User) SetName(name string) {
u.Name = name
}

这种情况下即使你写了 u.SetName("Tom"),原始变量 u.Name 也 不会被修改,因为你传进去的是一个副本。

✅ 总结:什么时候需要传 &变量

浏览 (60)
点赞
收藏
评论