为了账号安全,请及时绑定邮箱和手机立即绑定

如何遍历接口切片?

如何遍历接口切片?

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

?
喵喵时光机

TA贡献1846条经验 获得超7个赞

错误是正确的。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接口的每个单独对象返回它。


查看完整回答
反对 回复 2021-08-23
  • 1 回答
  • 0 关注
  • 182 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信