当我学习“ Go In Action”一书中的Go时,有一个如下的段代码。
我还没有对Go的界面概念了解太多。
该段定义了一个称为notifier的接口,用于通知人们,有两种类型(user,admin)表示该接口。sendNotification()说,有一个中间件统一了那些表示notifier接口的类型
让我感到困惑的是中间件函数sendNotification()的参数,它接收到一个inferface类型(notifier)的值(不是指针!)。但是,为什么在主函数中使用指针来调用该函数:
sendNodification(&lisa)
sendNodification(&bil)
??只是为什么?
windows 10.转到1.12.2
package main
import "fmt"
type notifier interface {nodify()}
type user struct {name string;email string}
type admin struct{name string;email string}
func (u *user) nodify (){
fmt.Printf("sending user email to %s<%s>\n", u.name, u.email)
}
func (u *admin) nodify(){
fmt.Printf("sending admin email to %s<%s>\n", u.name, u.email)
}
func sendNodification(n notifier){
n.nodify()
}
func main(){
bil := user{"Bill", "bill@gmail.com"}
sendNodification(&bil)
lisa := admin{"Lisa", "lisa@qq.com"}
sendNodification(&lisa)
}
答案 0 :(得分:3)
因为方法是使用指针接收器(StackPanel
而不是func (u *user) nodify
)声明的,所以它是实现接口的类型的指针。因此,您可以将func (u user) nodify
传递给接受*user
的函数,因为notifier
实现了接口。