如何遍历一片接口?

时间:2014-10-20 00:01:42

标签: go

Go还是新手。我试图实现答案as suggested here to my previous question。在这种情况下,我有一个动物界面和一堆动物结构。我希望能够遍历每只动物和动物。得到它的语言。我已经尝试了一个指针列表,但我一直收到错误" y.language undefined(类型动物没有字段或方法语言)":

My playground code

package main

import "fmt"

type animal interface {
    speak()
}

type dog struct{
    language string
}

func (d *dog) speak() {
    d.language = "woof"
}

var n = []animal{
    &dog{},
}


func main() {
    for _, w := range n{
        x := &dog{}
        fmt.Println(x)
        x.speak()
        fmt.Println(x.language)  // this works

        fmt.Println(w)
        y := w
        y.speak()
        fmt.Println(y.language)  // but this doesn't...why??
    }
}

编辑#1:让我的问题更清楚:为什么x:=& dog {}可以工作但y:= w不工作? 编辑#2:不爱新手;(

1 个答案:

答案 0 :(得分:3)

错误是正确的。 y := w声明y属于animal类型(因为您的n切片属于animal类型)。由于您的animal界面不包含language ...它不知道该怎么做,因此这是一个错误。

您可以通过使用类型断言断言它实际上是dog指针:

fmt.Println(y.(*dog).language)

..但是,我不确定你想要实现的目标。

当您引入的cat也没有language属性时,您的结构就会中断。因此,这也会有类似的问题(并希望证明你的问题在哪里):

type cat struct{
}

func (c *cat) speak() {
    // do nothing
}

你的问题的回答"我如何实现一片接口?" - 您需要向界面添加所需的任何内容,以便处理项目"通常"。这意味着将language属性转换为Language()方法,并通过实现animal接口的每个单独对象返回。