假设我要编写一个在切片中查找值的函数
我直观地想写:
func find(s []interface{}, f func(interface{})bool) int { for i, item := range s { if f(item) { return i } } return -1 }
但是我无法通过Go做到这一点。我可以与
Len() int Value(int) interface{} ...
这样就可以了,但是在我的真实代码中,事情变得更加复杂(我需要进行slices [from:end]等),append等…,如果我在接口中重新定义了所有这些代码,我最终会拥有很多代码。有没有更好的办法?
您可以使用反射。我为项目编写了此函数,请随时使用它:
// InSlice returns true if value is in slice func InSlice(value, slice interface{}) bool { switch reflect.TypeOf(slice).Kind() { case reflect.Slice, reflect.Ptr: values := reflect.Indirect(reflect.ValueOf(slice)) if values.Len() == 0 { return false } val := reflect.Indirect(reflect.ValueOf(value)) if val.Kind() != values.Index(0).Kind() { return false } for i := 0; i < values.Len(); i++ { if reflect.DeepEqual(values.Index(i).Interface(), val.Interface()) { return true } } } return false }