我遇到了两个错误,
a。不可能的类型断言。我们可以从接口类型施放到实际类型对象
b。不知道评估的含义是什么,但未使用
type IAnimal interface {
Speak()
}
type Cat struct{}
func (c *Cat) Speak() {
fmt.Println("meow")
}
type IZoo interface {
GetAnimal() IAnimal
}
type Zoo struct {
animals []IAnimal
}
func (z *Zoo) GetAnimal() IAnimal {
return z.animals[0]
}
测试
var zoo Zoo = Zoo{}
// add a cat
var cat IAnimal = &Cat{}
append(zoo.animals, cat) // error 1: append(zoo.animals, cat) evaluated but not used
// get the cat
var same_cat Cat = zoo.GetAnimal().(Cat) // error 2: impossible type assertions
fmt.Println(same_cat)
去操场
-
错误消息几乎说明了一切:
tmp/sandbox129360726/main.go:42: impossible type assertion: Cat does not implement IAnimal (Speak method has pointer receiver)
Cat
不实现IAnimal
,因为Speak
(IAnimal
接口的一部分)具有指针接收器,而Cat
不是指针。如果将
Cat
更改为*Cat
,则有效:var same_cat *Cat = zoo.GetAnimal().(*Cat)
-
错误也几乎说明了一切。
append(zoo.animals, cat)
您将
cat
附加到zoo.animals
(评估),然后丢弃结果,因为左侧没有任何内容。您可能想这样做:zoo.animals = append(zoo.animals, cat)
另一个侧面注意:当您直接分配到变量时,无需指定类型,因为GO可以为您确定它。因此
var same_cat Cat = zoo.GetAnimal().(Cat)
将更好地表示为:
var same_cat = zoo.GetAnimal().(Cat)
或:
same_cat := zoo.GetAnimal().(Cat)