You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:15:02