Можно ли преобразовать указатель типа интерфейса в VALUE при передаче параметра функции? - PullRequest
0 голосов
/ 11 апреля 2019

Когда я изучал Go по книге "Go In Action", есть код сегмента, как показано ниже.

Я не изучил Go слишком много в его концепции интерфейса.

Сегмент определяет интерфейс, называемый уведомителем, используемый для уведомления людей, и два типа (пользователь, администратор) подразумевают этот интерфейс. Существует промежуточное программное обеспечение, говорит sendNotification (), которое унифицирует тип, который подразумевает интерфейс уведомителя

Что меня смущает, так это параметр функции middleware sendNotification (), он получает значение (не указатель!) Типа нижнего интерфейса (уведомителя). Но почему для вызова этой функции в основной функции используется указатель:

sendNodification (& LISA)

sendNodification (& миллиард)

?? только почему?

windows 10. Go 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 Ответ

3 голосов
/ 11 апреля 2019

Поскольку методы объявляются с получателями указателей (func (u *user) nodify, а не func (u user) nodify), именно указатель на тип реализует интерфейс.Таким образом, вы можете передать *user функции, принимающей notifier, потому что *user реализует интерфейс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...