给出:
b = append(b[1:], n)
将增加容量
转移和分配自己
func shiftAndPut(a []int, n int) (b []int) {
b = make([]int, cap(a), cap(a))
for i,v := range(a[1:]) {
b[i] = v
}
b[len(b)-1] = n
return
}
https://play.golang.org/p/7xIBh0UPp2w
它保持容量不变,但需要进行各种计算
还有其他更优化的方法吗?
答案 0 :(得分:1)
切片环形缓冲区,自定义实现:
data := make([]int, cap, cap)
pointer := 0
data[pointer] = newData
pointer = (pointer+1) % cap
custom/ring软件包实现:
data := ring.New(cap)
data.Value = newData
data = data.Next()
在评论主题中提出建议后,我在benchmark和slice custom shifting之间做了custom/ring
BenchmarkCustom1000-4 100000 17322 ns/op
BenchmarkRing1000-4 100000 22824 ns/op
BenchmarkCustom-4 100000000 17.4 ns/op
BenchmarkRing-4 100000000 22.8 ns/op
使用变量(指针或标志)的自定义切片移位更快,并且内存得到了优化。