我对指针方法接收器和非指针方法接收器的理解是第一个可以在方法中修改,下一个不能。
所以,下面的工作完全符合我的预期。
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)
}
它打印hongseok/13 和unknown/0。
但是,我想通过重新分配立即替换更新方法中的整个 s。所以,我刚刚更改了如下更新方法。
func (s *student) update() {
s = &student{"unknown", 0}
}
并且它不会更改 main 方法中的 s 并打印双 hongseok/13。
func (s *student) update() {
*s = student{"unknown", 0}
}
以上更改解决了问题。
我认为没有语义差异。我错过了什么?
最佳答案
在第一个例子中:
func (s *student) update() {
s = &student{"unknown", 0}
}
您正在为 s
分配一个全新的“指针值”,并且新的 *s
指向一个新的 student
值。变量 s
的范围仅限于方法主体,因此返回后没有副作用。
在第二个例子中
func (s *student) update() {
*s = student{"unknown", 0}
}
您正在取消引用 s
,并将 *s
的值更改为指向新的 student
值,或者换句话说,您在 s
指向的地址处放置了一个新的 student
值。
关于go - 在指针方法接收器中重新分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38105543/