#go 传引用 传值这是一个非常经典的 Go 问题!我们来简单系统地梳理一下 什么时候方法调用需要传入 &参数。 ⸻ 🎯 总原则 是否需要 & 取决于: 1. 方法(或函数)参数的类型 是 值类型(T) 还是 指针类型(*T)。 2. 你当前变量的类型 是值类型还是指针类型。 3. 你是否希望方法内部能修改原变量的值。 ⸻ ✅ 具体情况详解 函数参数是指针类型(*T) 你需要传入变量的地址,也就是加 &。 type User struct { Name string } func updateName(u *User) { u.Name = "Alice" } func main() { u := User{} updateName(&u) // ✅ 传入地址 } 如果你写成 updateName(u),编译会报错,因为 u 是 User,不是 *User。 ⸻ 方法接收者是指针类型(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()。 ⸻ 方法接收者是值类型(func (u User) Method()) 那么传值和传引用的区别就显现出来了。 func (u User) SetName(name string) { u.Name = name } 这种情况下即使你写了 u.SetName("Tom"),原始变量 u.Name 也 不会被修改,因为你传进去的是一个副本。 ⸻ ✅ 总结:什么时候需要传 &变量