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.

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

报告相同问题?

悬赏问题

  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度