Go语言 在参数中具有不同切片类型的通用函数

vc9ivgsu  于 2023-11-14  发布在  Go
关注(0)|答案(2)|浏览(144)

我试图创建一个通用函数,该函数应该计算作为参数传递的切片,而不管其类型如何。我有几个不同类型的切片,但不知道如何正确执行:

  1. func SliceToChunks(arr []any, indices ...int) [][]any {
  2. collection := make([][]any, len(arr))
  3. n1 := indices[0]
  4. ...
  5. n6 := indices[5]
  6. collection = append(collection, arr[n1:n2])
  7. collection = append(collection, arr[n3:n4])
  8. collection = append(collection, arr[n5:n6])
  9. return collection
  10. }
  11. sliceA := []TypeA{1, 2, .. , 50}
  12. sliceB := []TypeB{1, 2, .. , 50}
  13. chunksA := SliceToChunks(sliceA, 5, 15)
  14. // result should be:
  15. //
  16. // chunksA = [][]TypeA{
  17. // sliceA[ 0: 5], 5 pcs
  18. // sliceA[ 5:20], 15 pcs
  19. // sliceA[20:35], 15 pcs
  20. // sliceA[35:50], 15 pcs
  21. // }
  22. chunksB := SliceToChunks(sliceB, 20, 25)
  23. // result should be:
  24. //
  25. // chunksB = [][]TypeB{
  26. // sliceB[ 0:20], 20 pcs
  27. // sliceB[20:45], 25 pcs
  28. // sliceB[45:50], 5 pcs (residue)
  29. // }

字符串
我将感激你的忠告。

z3yyvxxp

z3yyvxxp1#

不确定这是否是最好的方法,因为我不完全理解你想做什么,但给予这个看看。

  1. func SliceToChunks[T any](arr []T, ranges [][2]int) [][]T {
  2. n := len(ranges)
  3. collection := make([][]T, n)
  4. for i := 0; i < n; i++ {
  5. collection[i] = arr[ranges[i][0]:ranges[i][1]]
  6. }
  7. return collection
  8. }

字符串
因为你已经用长度(n)初始化了collection,所以你不必使用append,你可以直接访问索引。
此外,循环遍历范围以获得更简洁的代码。
最后,使用Go语言的generics。我不鼓励使用T any,你应该使用union类型或者像comparable这样的类型,因为使用any就违背了拥有一个类型系统的目的。

展开查看全部
1tu0hz3e

1tu0hz3e2#

我相信你可以使用interface{}泛型类型来实现这一点:

  1. func SliceToChunks(arr interface{}, indices ...int) interface{} {
  2. collection := make([]interface{}, len(indices)/2)
  3. for i := 0; i < len(indices); i += 2 {
  4. start := indices[i]
  5. end := indices[i+1]
  6. // Extract a sub-slice from arr and add it to the collection
  7. chunkValue := arrValue.Slice(start, end)
  8. collection[i/2] = chunkValue.Interface()
  9. }
  10. return collection
  11. }

字符串

展开查看全部

相关问题