无法将结构指针分配给接口指针

时间:2019-02-02 03:36:43

标签: go struct interface polymorphism

结构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 :(得分:3)

具有接口类型的变量已经是一个指针;您无需将其声明为指向接口的指针。只要执行var a Animal,它就会起作用。

答案 1 :(得分:1)

必须从接口中删除指针。


//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()
}

答案 2 :(得分:-1)

Dog是一种类型,所以*Dog是一种类型。

Dog不实现接口Animal,但实现*Dog

所以var a Animal = new(Dog)是确定。