关于interface的疑惑

saxon134 · · 1024 次点击
找到一个方法,可以稍微改善下这种不友好 完整代码如下: ``` 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
声明数组[]eat 数组里添加元素可以是Dog类型
#2