方法集定义了接口的实现规则
先上代码
package main
import (
"fmt"
)
type notifier interface {
Notify()
}
type User struct {
Name string
Age int
}
func (s *User) Notify() {
fmt.Println("name is: ", s.Name)
}
func notifination(n notifier) {
n.Notify()
}
func main() {
u := User{"james", 33}
notifination(u)
}
在这段代码中 ,首先定义了一个叫notifier的接口 实现了Notify接口 接着 定义了一个user结构体 定义了一个接收者为user指针类型的 Notify的method 然后定义了一个notifination的函数 函数的参数为 notifier接口类型。 在main函数中 u为结构体user的值类型 , 当调用函数notifination时 会编译错误, 错误信息为“。。。。”
这里有这个报错 是因为 go中方法集规则:
如图 在这个图中 从接收者的角度展示了方法集的规则 如果一个medthod的接收者定义为值类型 那么在调用的时候 传入值或者指针都可以 如果定义的是指针类型 那么只能为指针类型。也就是说在本例的代码中 如果传入&u 那么就不会有错误。