【问题标题】:Can't assign a struct pointer to a interface pointer无法将结构指针分配给接口指针
【发布时间】:2019-06-26 15:15:43
【问题描述】:

structDog实现了接口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

【问题讨论】:

    标签: go struct interface polymorphism


    【解决方案1】:

    具有接口类型的变量已经是指针;您无需将其声明为指向接口的指针。只需执行var a Animal 即可。

    【讨论】:

    • 您可以使用指向接口变量的指针从另一个范围更改变量的值。如果您有func f(a Animal),那么您可以在函数中使用a 来调用Animal 方法,但是如果您更改a 本身的值,则该更改仅在f 中可见。如果您改为写func f(a *Animal),那么a 现在是指向其他地方定义的某个接口变量的指针,您可以通过设置*a 来更改该变量。
    【解决方案2】:

    您必须从接口中删除指针。

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

    【讨论】:

      【解决方案3】:

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

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

      所以var a Animal = new(Dog) 没问题。

      【讨论】:

      • 如果我使用Dog 来实现Animalvar a *Animal=new(Dog) 也会失败!为什么? @HolaYang
      • 这是另一个问题,指向接口的指针在 golang.w 中几乎从来没有用过
      • 阅读this了解更多信息。
      猜你喜欢
      • 1970-01-01
      • 2018-05-16
      • 1970-01-01
      • 2013-12-10
      • 2019-03-24
      • 2011-06-18
      • 1970-01-01
      • 2013-01-21
      • 2013-01-29
      相关资源
      最近更新 更多