1、定义一个interface
```
type eat interface {
Eat()
}
```
2、定义一个struct,并实现Eat()方法
```
type Dog struct {
}
func (m Dog) Eat() {
print("dog eat.")
}
```
3、定义两个方法,形参一个eat interface,一个是数组
```
func beginEat(v eat) {
v.Eat()
}
func allBeginEat(ary []eat) {
for _,v:=range ary {
v.Eat()
}
}
```
4、实参为Dog是没问题的,但是数组就会提示类型不匹配。
```
var dog = Dog{}
beginEat(dog)
ary:=make([]Dog,0,2)
allBeginEat(ary) //报错,类型不匹配
```
5、问题:类似这种情形,想传递一个数组的interface,有没有什么办法呢?
完整代码如下:
```
package main
func main() {
var dog = Dog{}
beginEat(dog) //此处正常
var ary []Dog
allBeginEat(ary) //此处会提示类型不一致。
}
type eat interface {
Eat()
}
type Dog struct {
}
func (m Dog) Eat() {
print("dog eat.")
}
func beginEat(v eat) {
v.Eat()
}
func allBeginEat(ary []eat) {
for _, v := range ary {
v.Eat()
}
}
```
第一个方案,就是评论区第二条兄弟提的方案,我在第三条评论有回复;
第二个方案,即意味着每个类似Dog的类型,都需要做一个convert接口,而且类型转化也是费存储的。
我这边考虑的场景是:
有很多类似Dog的类型,如鸡、鸭、鹅、小猫啥的,一般在上下文,我们用的数组类似是:[]Dog,而不会是[]eat
之后在一个通用的处理的地方,需要正确去识别数组类型,去调用相对应的eat。
通用处理,不可能去断言所有类型,因为不可能外面接口增加一种类型,通用接口增加一句断言,否则就失去通用的意义了。
#7
更多评论
如果把allBeginEat形参换成interface,参数可以传递;
但是在函数里进行断言的时候,[]eat跟[]Dog断言是失败的
这就很尴尬了。
#1