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转成[]eat
因为一般上下文都是[]Dog,在需要调用allBeginEat的时候,才需要[]eat
感觉不是很友好。
#3
更多评论
如果把allBeginEat形参换成interface,参数可以传递;
但是在函数里进行断言的时候,[]eat跟[]Dog断言是失败的
这就很尴尬了。
#1