【问题标题】:golang method pointer to receiver指向接收器的golang方法指针
【发布时间】:2014-07-30 16:22:18
【问题描述】:

我有以下结构和:

type Person struct {
    Name    string
}


steve := Person{Name: "Steve"}

你能解释一下以下两种方法(一种没有指针,一种在接收器中)都能够打印 p.Name 吗?

func (p *Person) Yell() {
    fmt.Println("Hi, my name is", p.Name)
}

func (p Person) Yell(){
    fmt.Println("YELLING MY NAME IS", p.Name)
}

steve.Yell()

直接指向 Person(不是实例 steve)时,Name 会不会不存在?

【问题讨论】:

    标签: pointers go


    【解决方案1】:

    两者都指向实例,但是每次调用函数时(p Person) 都指向一个新副本,其中(p *Person) 将始终指向同一个实例。

    查看this 示例:

    func (p Person) Copy() {
        p.Name = "Copy"
    }
    
    func (p *Person) Ptr() {
        p.Name = "Ptr"
    }
    
    func main() {
        p1, p2 := Person{"Steve"}, Person{"Mike"}
        p1.Copy()
        p2.Ptr()
        fmt.Println("copy", p1.Name)
        fmt.Println("ptr", p2.Name)
    }
    

    另请阅读Effective Go,这是该语言的绝佳资源。

    【讨论】:

    • 所以我假设如果该方法改变了 p.Name 的值,那么它会改变原来的 'steve' 但如果我在 (p Person) 版本中改变 Name 的值,我正在改变一些东西由于我没有副本的句柄,将立即无法访问?
    • 就像一个注释一样,按值调用方法时存在性能差异。根据您的结构的大小或调用方法的频率,它可能重要也可能不重要,但这是需要考虑的事情:)
    猜你喜欢
    • 2016-02-29
    • 1970-01-01
    • 2015-01-26
    • 1970-01-01
    • 1970-01-01
    • 2018-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多