我想表达一个可以分割的函数。我以为我可以这样做:
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 {}的表示形式是不同的。
some_other_fun(..)
interface{}
[]DEFINITE_TYPE
[]interface{}
上面golang.org链接中提供的建议建议从该DEFINITE_TYPE切片中重建一个新的接口切片。但是,在我想调用该函数的代码中到处都不能做到这一点(此函数本身仅缩写9行代码,但是这9行在我们的代码中经常出现)。
DEFINITE_TYPE
在每种情况下,我想调用该函数时,我都会传递一个[]*DEFINITE_TYPE起初认为会更容易抽象的函数,直到再次发现。
[]*DEFINITE_TYPE
此外,每次我要调用该函数时,它都是不同的,DEFINITE_TYPE因此为n个类型实现n个示例不会节省我任何代码行或使我的代码更清晰(相反!)。
令人沮丧的是我无法执行此操作,因为我们的代码中有9行是惯用的,而且错误键入很容易引入错误。我真的很缺少泛型。真的没有办法吗?!
可能最好的办法是定义一个接口,该接口封装myFunc切片需要执行的操作(即,在您的示例中,获取第n个元素)。然后,函数的参数是该接口类型,然后您为每种要传递给函数的类型定义接口方法。
myFunc
您也可以使用reflect包来完成此操作,但这可能不是一个好主意,因为如果您传递除slice(或数组或字符串)以外的其他内容,则可能会感到恐慌。
reflect
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。