douzai9405 2016-06-29 16:42
浏览 19
已采纳

重新分配指针方法接收器

What I understand about pointer method receiver and non-pointer method receiver is first one can be modified in the method and next one isn't.

So, following worked exactly as I expected.

type student struct {
    name string
    age  int
}

func (s *student) update() {
    s.name = "unknown"
    s.age = 0
}

func main() {
    s := student{"hongseok", 13}
    fmt.Println(s)

    s.update()
    fmt.Println(s)
}

It prints hongseok/13 and unknown/0.

But, I want to replace whole s in update method at once with reassigning. So, I've just altered update method as bellow.

func (s *student) update() {
    s = &student{"unknown", 0}
}

And it doesn't change s in main method and prints double hongseok/13.

func (s *student) update() {
    *s = student{"unknown", 0}
}

Above change fix the problem.

I think there's no semantic difference. What am I missing?

  • 写回答

3条回答 默认 最新

  • doulao3905 2016-06-29 16:49
    关注

    In the first example:

    func (s *student) update() {
        s = &student{"unknown", 0}
    }
    

    You are assigning an entirely new "pointer value" to s, and the new *s points at a new student value. The variable s is scoped only to the method body, so there are no side effects after this returns.

    In the second example

    func (s *student) update() {
        *s = student{"unknown", 0}
    }
    

    You are dereferencing s, and changing the value of *s to point to a new student value, or to put it differently, you are putting a new student value at the address where s points.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 使用EMD去噪处理RML2016数据集时候的原理
  • ¥15 神经网络预测均方误差很小 但是图像上看着差别太大
  • ¥15 Oracle中如何从clob类型截取特定字符串后面的字符
  • ¥15 想通过pywinauto自动电机应用程序按钮,但是找不到应用程序按钮信息
  • ¥15 如何在炒股软件中,爬到我想看的日k线
  • ¥15 seatunnel 怎么配置Elasticsearch
  • ¥15 PSCAD安装问题 ERROR: Visual Studio 2013, 2015, 2017 or 2019 is not found in the system.
  • ¥15 (标签-MATLAB|关键词-多址)
  • ¥15 关于#MATLAB#的问题,如何解决?(相关搜索:信噪比,系统容量)
  • ¥500 52810做蓝牙接受端