小编典典

在Go中,如何使用切片创建通用函数?

go

假设我要编写一个在切片中查找值的函数

我直观地想写:

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等…,如果我在接口中重新定义了所有这些代码,我最终会拥有很多代码。有没有更好的办法?


阅读 264

收藏
2020-07-02

共1个答案

小编典典

您可以使用反射。我为项目编写了此函数,请随时使用它:

// 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
}
2020-07-02