如何遍历一片接口?

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 ;(

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.