初级会员
  • 第 25549 位会员
  • saxon134
  • saxon
  • 2018-11-19 15:48:03
  • Offline
  • 20 12

最近分享的资源

    暂无

最近发布的项目

    暂无

最近的评论

  • 评论了主题 revel go mod使用问题
    #3 @kernel_kernel revel web框架
  • 评论了主题 revel go mod使用问题
    #1 @kernel_kernel 我试过是不行的 go mod init / go mod tidy都成功了,版本是1.13 revel run的时候,会提示在src下找不到工程 go run运行,也会报错
  • 评论了主题 关于interface的疑惑
    第一个方案,就是评论区第二条兄弟提的方案,我在第三条评论有回复; 第二个方案,即意味着每个类似Dog的类型,都需要做一个convert接口,而且类型转化也是费存储的。 我这边考虑的场景是: 有很多类似Dog的类型,如鸡、鸭、鹅、小猫啥的,一般在上下文,我们用的数组类似是:[]Dog,而不会是[]eat 之后在一个通用的处理的地方,需要正确去识别数组类型,去调用相对应的eat。 通用处理,不可能去断言所有类型,因为不可能外面接口增加一种类型,通用接口增加一句断言,否则就失去通用的意义了。
  • 按照上面的代码手动敲了一遍,可以运行的。 就测试而言,有两个地方: 1、12行,for里面需要加点代码,否则会编译不过; 2、22行defer应该放到18行前面;
  • 评论了主题 关于interface的疑惑
    找到一个方法,可以稍微改善下这种不友好 完整代码如下: ``` 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..") } } } ```