Go语言中解引用结构体指针是否会复制结构体?
为什么你的Go代码输出和预期不符?
你完全说对了!b := *a 确实是在创建结构体的副本,这就是问题的核心所在。
咱们一步步纠正你的理解:
- 第一步
a := &countHolder{1}:你的理解没问题,a是指向内存地址x处结构体的指针,这个结构体的count初始值是1。 - 第二步
b := *a:这里不是让b“等于地址x”,而是Go会把地址x处的整个countHolder结构体完整复制一份,放到新的内存地址y里,b就是这个新结构体的实例。这时候a指向的结构体和b本身是完全独立的两个对象,只是初始值相同而已。 - 第三步
a.count = 2:你修改的是地址x处原结构体的count值,但地址y处的b的count还是最初复制过来的1,所以println(b.count)自然会输出1。
如果想要得到预期的输出2,有两种常见的修改方式:
- 让b也成为指针,指向同一个结构体:
type countHolder struct { count int } func main() { a := &countHolder{1} b := a // b现在和a指向同一个结构体 a.count = 2 println(b.count) // 输出2 } - 如果你确实需要b是值类型,那在修改a之后重新复制一次:
type countHolder struct { count int } func main() { a := &countHolder{1} b := *a a.count = 2 b = *a // 重新复制修改后的结构体 println(b.count) // 输出2 }
第一种方式更符合Go的惯用写法,也更高效,因为不需要复制整个结构体。
内容的提问来源于stack exchange,提问作者lf215
相关产品推荐
相关产品推荐

