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()
}
}
```
找到一个方法,可以稍微改善下这种不友好
完整代码如下:
```
package main
import (
"reflect"
)
func main() {
var dog = Dog{}
beginEat(dog)
ary := make([]Dog, 0, 1)
ary = append(ary, Dog{})
allBeginEat(ary)
}
type eat interface {
Eat()
}
type Dog struct {
}
func (m Dog) Eat() {
print("dog eat.")
}
func beginEat(v eat) {
v.Eat()
}
//使用interface作为形参<
func allBeginEat(ary interface{}) {
if ary == nil {
return
}
v := reflect.ValueOf(ary)
if v.Kind() != reflect.Slice {
return
}
cnt := v.Len()
for i := 0; i < cnt; i++ {
vv:=v.Index(i)
vvv:=v.Index(i).Interface()
//此处断言是可以成功的
if e,ok:=vvv.(eat);ok {
print("vvv is eat..")
e.Eat();
} else {
print("vvv is not eat..")
}
}
}
```
#4
更多评论
如果把allBeginEat形参换成interface,参数可以传递;
但是在函数里进行断言的时候,[]eat跟[]Dog断言是失败的
这就很尴尬了。
#1