Go还是新手。我试图实现答案as suggested here to my previous question。在这种情况下,我有一个动物界面和一堆动物结构。我希望能够遍历每只动物和动物。得到它的语言。我已经尝试了一个指针列表,但我一直收到错误" 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:不爱新手;(
答案 0 :(得分:3)
错误是正确的。 y := w
声明y
属于animal
类型(因为您的n
切片属于animal
类型)。由于您的animal
界面不包含language
...它不知道该怎么做,因此这是一个错误。
您可以通过使用类型断言断言它实际上是dog
指针:
fmt.Println(y.(*dog).language)
..但是,我不确定你想要实现的目标。
当您引入的cat
也没有language
属性时,您的结构就会中断。因此,这也会有类似的问题(并希望证明你的问题在哪里):
type cat struct{
}
func (c *cat) speak() {
// do nothing
}
你的问题的回答"我如何实现一片接口?" - 您需要向界面添加所需的任何内容,以便处理项目"通常"。这意味着将language
属性转换为Language()
方法,并通过实现animal
接口的每个单独对象返回。