[go]在指针方法接收器中重新分配

· 收录于 2024-01-06 09:46:07 · source URL

问题详情

我对指针方法接收器

和非指针方法接收器的理解是,第一个可以在方法中修改,下一个不能。

因此,跟随完全符合我的预期。

它打印 hongseok/13unknown/0

但是,我想立即用重新分配替换更新方法中的整个 s。所以,我刚刚将更新方法更改为以下。

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

并且它不会改变 main 方法并打印双 hongseok/13

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

以上更改解决了问题。

我认为没有语义上的区别。我错过了什么?

最佳回答

在第一个示例中:

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

您正在为 s 分配一个全新的指针值,而新的 *s 指向一个新的学生值。变量 s 的范围仅限于方法主体,因此返回后不会产生副作用。

在第二个示例中

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

您正在取消引用 s,并更改 *s 的值以指向新的学生值,或者换句话说,您将新的学生值放在 s 指向的地址上。