Fra*_*is 5 pointers go receiver
如何使用指针方法初始化指针接收器?
package main
import "fmt"
type Person struct {
name string
age int
}
func (p *Person) Born() {
if nil == p {
p = new(Person)
}
}
func main() {
var person *Person
person.Born()
if person == nil {
fmt.Println("This person should be initialized. Why is that not the case?")
}
fmt.Println(person)
}
Run Code Online (Sandbox Code Playgroud)
在调用.Born()方法之后,人们会期望人被初始化(归零),这是一个指针接收器.但事实并非如此.有人可以对此有所了解吗?
在调用.Born()方法之后,人们会期望人被初始化(归零),这是一个指针接收器.
在接收器上调用方法假定接收器已经初始化.
所以你需要初始化它:
var person *Person
person = &Person{} // Sets the pointer to point to an empty Person{} struct
Run Code Online (Sandbox Code Playgroud)
或者在一个声明中:
var person = &Person{}
Run Code Online (Sandbox Code Playgroud)
或简写:
person := &Person{}
Run Code Online (Sandbox Code Playgroud)
您的自我初始化失败的原因:
func (p *Person) Born() {
if nil == p {
p = new(Person)
}
}
Run Code Online (Sandbox Code Playgroud)
这是你的新任务p是作用于Born()函数,所以在函数之外它没有任何影响.