您的位置:首页 >Golang值类型与指针类型拷贝区别
发布于2026-02-19 阅读(0)
扫一扫,手机访问
值类型赋值复制整块数据,指针赋值仅复制地址;函数传参均为值传递,但传值类型拷贝全部内容,传指针仅拷贝地址;方法接收者选值或指针取决于是否需修改字段,统一使用指针接收者可避免接口实现问题。

当你写 a := b,且 b 是 int、string 或小 struct 时,Go 真的把所有字节都拷贝了一份。两个变量完全独立,改一个不影响另一个。
person := User{Name: "Alice"},再 copy := person,然后 copy.Name = "Bob",结果 person.Name 还是 "Alice"[1024 * 1024]byte,一次赋值就拷贝 1MBp := &x 得到的是地址值,q := p 只是把那个地址(比如 0xc00001a240)又存了一份——两个指针指向同一片内存。
ptr1 := &user,ptr2 := ptr1,然后 *ptr2 = User{Name: "Charlie"},*ptr1 立刻变成 "Charlie";如果忘了判空,*nilPtr 直接 panic*T 类型的方法集包含 T 和 *T 的所有方法,但 T 类型的方法集**只含 T 上定义的方法**;混用会导致接口实现不一致Go 所有参数都是值传递,但“值”的内容不同:传 User 是传整个结构体副本;传 *User 是传一个 8 字节的地址副本。
func update(u User) { u.Age = 30 } 永远改不了外面的 user;必须写成 func update(u *User) { u.Age = 30 } 并调用 update(&user)map、slice)、或未来可能加修改方法 → 优先传 *T接收者是 (u User) 还是 (u *User),决定了这个方法能不能真正改变调用者的字段。
func (u *User) SetName(name string) { u.Name = name };否则赋值只作用于副本func (u User) FullName() string { return u.Name + " " + u.Surname },不会意外污染原数据*User 接收者,否则 User 值变量无法满足含指针方法的接口最常被忽略的一点:指针零值是 nil,而值类型零值是确定的(0、""、false)。解引用前不检查 if p != nil,程序会在运行时崩溃,而且这种 panic 往往发生在深层调用里,排查成本高。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9