处理不同数据类型的方法

时间:2019-07-05 02:07:19

标签: go

我想做一个可以接受不同数据类型的方法,但是Go没有泛型。我必须编写以下重复代码:

func GetRandomSubarrayInt64(candidates []int64, length int) []int64 {
    result := make([]int64, 0, length)
    if len(candidates) == 0 {
        return result
    }
    if len(candidates) <= length {
        return candidates
    }
    rand.Shuffle(len(candidates), func(i, j int) {
        candidates[i], candidates[j] = candidates[j], candidates[i]
    })
    return candidates[:length]
}


func GetRandomSubarrayString(candidates []string, length int) []string {
    result := make([]string, 0, length)
    if len(candidates) == 0 {
        return result
    }
    if len(candidates) <= length {
        return candidates
    }
    rand.Shuffle(len(candidates), func(i, j int) {
        candidates[i], candidates[j] = candidates[j], candidates[i]
    })
    return candidates[:length]
}

该代码几乎是重复的。是否有减少重复代码的方法?

2 个答案:

答案 0 :(得分:-1)

是的,Golang目前不支持泛型。

但是您可以尝试这种方式:

func GetRandomSubarray(candidates interface{}, length int) interface{} {
    candidatesValue := reflect.ValueOf(candidates)
    if candidatesValue.Kind() != reflect.Slice {
        panic("supports slice only")
    }
    if candidatesValue.Len() == 0 {
        return candidates
    }
    if candidatesValue.Len() <= length {
        return candidates
    }
    rand.Shuffle(candidatesValue.Len(), reflect.Swapper(candidates))
    return candidatesValue.Slice(0, length).Interface()
}

用法:

s := []string{"1", "2", "3"}
rs := GetRandomSubarray(s, 1).([]string)

i := []int{1, 2, 3}
ri := GetRandomSubarray(i, 1).([]int)

答案 1 :(得分:-1)

您可以定义一个接口,该接口导出方法以交换通用基础数组中的项目。然后,您将需要使用特定于类型的数组/切片来实现此接口。像this之类的东西。

type ShuffleSlice interface {
    Swap(i, j int)
    Len() int
}

func GetRandomSubslice(candidates ShuffleSlice) ShuffleSlice {
    if candidates == nil || candidates.Len() == 0 {
        return nil
    }
    rand.Shuffle(candidates.Len(), func(i, j int) {
        candidates.Swap(i, j)
    })
    return candidates
}

type ShuffleSliceInt []int

func (s ShuffleSliceInt) Swap(i, j int) {
    s[i], s[j] = s[j], s[i]
}

func (s ShuffleSliceInt) Len() int {
    return len(s)
}