为什么此代码有效?函数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()
}
答案 0 :(得分:4)
任何其他类型T的方法集都包含以接收者类型T声明的所有方法。相应的指针类型* T的方法集是所有以接收者* T或T声明的方法的集合(也就是说,包含方法集T)。
答案 1 :(得分:3)
Go func
不能与OOP语言中常见的类方法混淆。无论您是否将实例定义为指针,当 receiver 是指针时,Go都会将您的实例作为指针传递给func
。
P.S。您甚至可以用func
的接收者来呼叫nil
,如下:
var p *Persion // p == nil
p.Introduce() // Compiler: OK!