【问题标题】:In Go, how can I partition a slice/array/string of any type?在 Go 中,如何对任何类型的切片/数组/字符串进行分区?
【发布时间】:2015-05-14 16:34:24
【问题描述】:

Guava 有一个generic partition method,由于 Go 缺乏泛型,因此无法直接在 Go 中实现。有解决办法吗?

【问题讨论】:

    标签: arrays go slice partitioning generic-programming


    【解决方案1】:

    gopart 库解决了这个问题。它允许对 Go 中任何类型的可索引的任何内容进行分区。

    for idxRange := range gopart.Partition(len(bigList), partitionSize) {
            bulkOperation(bigList[idxRange.Low:idxRange.High])
    }
    

    Full Executable Example

    【讨论】:

      【解决方案2】:

      我找到了这个问题和答案,因为在创建已经存在的东西之前,我需要相同的解决方案。

      但是,我确实不喜欢该解决方案的性能,因此我创建了一个具有更快、更灵活实现的包。

      为了提高速度,我没有使用通道,而是使用了一个函数,该函数作为结果回调传递给该函数。我还添加了使用切片和接口的实现,以及一个通道来比较所有这些方法的性能,并让用户可以灵活地使用他们需要的方法。

      为了防止其他人也需要创建自己的实现,我在以下网址公开了它:https://github.com/crosscode-nl/partition

      根据代码的基准显示,基于通道的解决方案比 func 版本慢。

      BenchmarkToChan100-4           50000         25862 ns/op
      BenchmarkToChan10-4           300000          4939 ns/op
      BenchmarkToChan0-4            500000          2727 ns/op
      BenchmarkToFunc100-4         5000000           230 ns/op
      BenchmarkToFunc10-4         30000000            46.5 ns/op
      BenchmarkToFunc0-4          100000000           14.6 ns/op
      

      示例用法:

      a := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
      partition.ToFunc(len(a), 5, func(l int, h int) {
          fmt.Printf("Part: %v\n", a[l:h])
      })
      // Output:
      // Part: [1 2 3 4 5]
      // Part: [6 7 8 9]
      

      有关详细信息,请参阅 repo 中的基准。

      【讨论】:

      • 请描述该解决方案在何种方面具有更好的性能,以便我选择它作为首选答案。
      • 欢迎来到 StackOverflow!你能用几句话解释你到底做了什么吗?摘录您的代码会更好
      猜你喜欢
      • 2012-11-20
      • 2011-12-03
      • 2012-12-25
      • 2020-09-21
      • 2015-11-18
      • 2023-04-03
      • 2021-03-12
      • 2017-04-21
      • 2014-01-22
      相关资源
      最近更新 更多