一尘不染

表示功能,可任意分割

go

我想表达一个可以分割的函数。我以为我可以这样做:

func myFunc(list []interface{}) {
  for _, i := range list {
    ...
    some_other_fun(i)
    ...
  }
}

其中some_other_fun(..)本身需要的interface{}类型。但是,这不起作用,因为您不能通过[]DEFINITE_TYPEas
[]interface{}。请参阅:https
:
//golang.org/doc/faq#convert_slice_of_interface,它指出[]
interface {}的表示形式是不同的。

上面golang.org链接中提供的建议建议从该DEFINITE_TYPE切片中重建一个新的接口切片。但是,在我想调用该函数的代码中到处都不能做到这一点(此函数本身仅缩写9行代码,但是这9行在我们的代码中经常出现)。

在每种情况下,我想调用该函数时,我都会传递一个[]*DEFINITE_TYPE起初认为会更容易抽象的函数,直到再次发现。

此外,每次我要调用该函数时,它都是不同的,DEFINITE_TYPE因此为n个类型实现n个示例不会节省我任何代码行或使我的代码更清晰(相反!)。

令人沮丧的是我无法执行此操作,因为我们的代码中有9行是惯用的,而且错误键入很容易引入错误。我真的很缺少泛型。真的没有办法吗?!


阅读 149

收藏
2020-07-02

共1个答案

一尘不染

可能最好的办法是定义一个接口,该接口封装myFunc切片需要执行的操作(即,在您的示例中,获取第n个元素)。然后,函数的参数是该接口类型,然后您为每种要传递给函数的类型定义接口方法。

您也可以使用reflect包来完成此操作,但这可能不是一个好主意,因为如果您传递除slice(或数组或字符串)以外的其他内容,则可能会感到恐慌。

func myFunc(list interface{}) {
    listVal := reflect.ValueOf(list)
    for i := 0; i < listVal.Len(); i++ {
        //...
        some_other_fun(listVal.Index(i).Interface())
        //...
    }
}

参见https://play.golang.org/p/TyzT3lBEjB

2020-07-02