如何遍历接口切片?

仍然是 Go 的新手。我正在尝试按照我上一个问题的建议实施答案。在这种情况下,我有一个动物界面和一堆动物结构。我希望能够遍历每个动物并获得它的语言。我已经尝试了一个指针列表,但我不断收到错误“y.language undefined(动物类型没有字段或方法语言)”:

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:不喜欢新手;(


慕工程0101907
浏览 183回答 1
1回答

喵喵时光机

错误是正确的。y := w声明y为 type animal(因为您的nslice 为 type animal)。由于您的animal界面不包含language......它不知道该怎么做,因此这是一个错误。您可以dog使用类型断言断言它实际上是一个指针:fmt.Println(y.(*dog).language)..但是,我不确定您要实现的目标。当您引入一个cat也没有language属性的结构时,您的结构就会中断。因此,这也会有类似的问题(并希望证明您的问题所在):type cat struct{}func (c *cat) speak() {    // do nothing}对“如何实现接口切片?”的问题的回答。- 您需要将您需要的任何内容添加到界面中,以便“一般地”处理项目。这意味着将language属性转换为Language()方法并通过实现animal接口的每个单独对象返回它。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go