我想做一个可以接受不同数据类型的方法,但是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]
}
该代码几乎是重复的。是否有减少重复代码的方法?
答案 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)
}