Guava有一个generic partition method,由于Go缺乏泛型,因此不能直接在Go中实现。这有解决方法吗?
gopart库解决了这个问题。它允许在具有任何类型的Go中对可索引的任何内容进行分区。
for idxRange := range gopart.Partition(len(bigList), partitionSize) {
bulkOperation(bigList[idxRange.Low:idxRange.High])
}
我找到了这个问题和答案,因为在创建已经存在的东西之前,我需要相同的解决方案。
但是,我确实不喜欢解决方案的性能,所以我创建了一个包含更快,更灵活的实现的包。
为了提高速度,我使用了一个传递给函数的函数,而不是使用通道作为结果的回调。我还使用切片和接口添加了实现,并使用通道1来比较所有这些方法的性能,并为用户提供了使用所需方法的灵活性。
为了防止其他人也需要创建自己的实现,我在以下网址公开发布: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]
有关详细信息,请参阅仓库中的基准。