dourong8495 2014-10-20 00:01
浏览 71
已采纳

如何遍历一片接口?

Still new to Go. I'm trying to implement the answer as suggested here to my previous question. In this case I have an animal interface and a bunch of animal structs. I want to be able to iterate over each animal & get it's language. I've tried a list of pointers but I keep getting an error "y.language undefined (type animal has no field or method language)":

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??
    }
}

EDIT #1: To make my question clearer: Why does x := &dog{} work but y := w does not? EDIT #2: No love for newbs ;(

  • 写回答

1条回答 默认 最新

  • doufan6544 2014-10-20 00:30
    关注

    The error is correct. y := w is declaring y to be of type animal (as your n slice is of type animal). As your animal interface does not contain language ... it doesn't know what to do and as such it is an error.

    You can assert that it is actually a dog pointer by using a type assertion:

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

    ..however, I am not sure what you're trying to achieve.

    Your structure breaks when you introduce a cat that doesn't have a language property too. As such, this will also have similar problems (and hopefully demonstrate where your issue lies):

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

    The answer to your question of "How do I implement a slice of interfaces?" - you need to add whatever you require to the interface in order to process the items "generically". This means turning the language property into a Language() method and returning it via each individual object that implements the animal interface.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 请分析一下这个电路设计的优点🙏
  • ¥15 求视频摘要youtube和ovp数据集
  • ¥15 怎么改成输入一个要删除的数后现实剩余的数再输入一个删除的数再现实剩余的数用yes表示继续no结束程序
  • ¥15 在启动roslaunch时出现如下问题
  • ¥15 汇编语言实现加减法计算器的功能
  • ¥20 关于多单片机模块化的一些问题
  • ¥30 seata使用出现报错,其他服务找不到seata
  • ¥35 引用csv数据文件(4列1800行),通过高斯-赛德尔法拟合曲线,在选取(每五十点取1点)数据,求该数据点的曲率中心。
  • ¥20 程序只发送0X01,串口助手显示不正确,配置看了没有问题115200-8-1-no,如何解决?
  • ¥15 Google speech command 数据集获取