Golang中的函数声明严格吗?

时间:2018-12-17 19:44:36

标签: go

为什么此代码有效?函数Introduce()接受指向Person的指针 但是当我们创建p时-它是一个对象(不是指针)。 函数声明不严格吗?

package main

import "fmt"

type Person struct {
    Name string
}

func (p *Person) Introduce() {
    fmt.Printf("Hi, I'm %s\n", p.Name)
}

func main() {

    p := Person{Name: "Fedya"}
    fmt.Println(p)
    p.Introduce()

    p1 := &Person{Name: "Fedya"}
    fmt.Println(p1)
    p1.Introduce()

}

2 个答案:

答案 0 :(得分:4)

Per the specification

  

任何其他类型T的方法集都包含以接收者类型T声明的所有方法。相应的指针类型* T的方法集是所有以接收者* T或T声明的方法的集合(也就是说,包含方法集T)。

答案 1 :(得分:3)

接受对象 receiver (用括号括起来)的

Go func不能与OOP语言中常见的类方法混淆。无论您是否将实例定义为指针,当 receiver 是指针时,Go都会将您的实例作为指针传递给func

P.S。您甚至可以用func的接收者来呼叫nil,如下:

var p *Persion  // p == nil
p.Introduce()   // Compiler: OK!