Не удается назначить указатель структуры на указатель интерфейса - PullRequest
0 голосов
/ 02 февраля 2019

Структура Dog реализует все методы интерфейса Animal, почему *Dos нельзя присвоить *Animal?

type Animal interface {
    run()
}

type Dog struct {
    name string
}

func (d *Dog) run() {
    fmt.Println( d.name , " is running")
}

func main(){
    var d *Dog
    var a *Animal

    d = new(Dog)
    d.run()
    a = d   //errors here
}

Go сообщает следующие ошибки:

Cannot use 'd' (type *Dog) as type *Animal in assignment

Ответы [ 3 ]

0 голосов
/ 02 февраля 2019

Dog является типом, поэтому *Dog является.

Dog НЕ реализует интерфейс Animal, но *Dog делает.

Итак var a Animal = new(Dog)все в порядке.

0 голосов
/ 02 февраля 2019

Вы должны удалить указатель с интерфейса.


//Animal interface
type Animal interface {
    run()
}

//Dog struct
type Dog struct {
    name string
}

func (d *Dog) run() {
    fmt.Println(d.name, "is running")
}

func main() {
    var d *Dog
    var a Animal

    d = new(Dog)
    d.name = "Putty"
    d.run()
    a = d //errors here
    a.run()
}

0 голосов
/ 02 февраля 2019

Переменная с типом интерфейса уже является указателем;вам не нужно объявлять его как указатель на интерфейс.Просто сделайте var a Animal и все заработает.

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