在指针方法Go中初始化指针接收器

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()方法之后,人们会期望人被初始化(归零),这是一个指针接收器.但事实并非如此.有人可以对此有所了解吗?

Fli*_*mzy 8

在调用.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()函数,所以在函数之外它没有任何影响.