[go]在指针方法接收器中重新分配
· 收录于 2024-01-06 09:46:07 · source URL
问题详情
我对指针方法接收器和非指针方法接收器的理解是,第一个可以在方法中修改,下一个不能。
因此,跟随完全符合我的预期。
它打印 hongseok/13 和 unknown/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
指向的地址上。