可以在传递函数参数时将接口类型的指针转​​换为VALUE吗?

时间:2019-04-11 15:47:50

标签: go

当我学习“ 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)
}

1 个答案:

答案 0 :(得分:3)

因为方法是使用指针接收器(StackPanel而不是func (u *user) nodify)声明的,所以它是实现接口的类型的指针。因此,您可以将func (u user) nodify传递给接受*user的函数,因为notifier实现了接口。