在Go中,如何对任何类型的切片/数组/字符串进行分区?

时间:2015-05-14 16:34:25

标签: arrays go slice partitioning generic-programming

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

2 个答案:

答案 0 :(得分:5)

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

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

Full Executable Example

答案 1 :(得分:0)

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

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

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

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

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

eq

用法示例:

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

有关详细信息,请参见回购中的基准。