从接口类型到实际类型的不可能的类型主张

  • 本文关键字:类型 不可能 接口类型 go
  • 更新时间 :
  • 英文 :


我遇到了两个错误,

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)

去操场

  1. 错误消息几乎说明了一切:

    tmp/sandbox129360726/main.go:42: impossible type assertion:
        Cat does not implement IAnimal (Speak method has pointer receiver)
    

    Cat不实现IAnimal,因为SpeakIAnimal接口的一部分)具有指针接收器,而Cat不是指针。

    如果将Cat更改为*Cat,则有效:

    var same_cat *Cat = zoo.GetAnimal().(*Cat)
    
  2. 错误也几乎说明了一切。

     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)

相关内容

最新更新