gpt4 book ai didi

go - 在golang中连接多个 slice

转载 作者:IT老高 更新时间:2023-10-28 13:04:29 26 4
gpt4 key购买 nike

我正在尝试合并多个 slice ,如下所示,

package routes

import (
"net/http"
)

type Route struct {
Name string
Method string
Pattern string
Secured bool
HandlerFunc http.HandlerFunc
}

type Routes []Route

var ApplicationRoutes Routes

func init() {
ApplicationRoutes = append(
WifiUserRoutes,
WifiUsageRoutes,
WifiLocationRoutes,
DashboardUserRoutes,
DashoardAppRoutes,
RadiusRoutes,
AuthenticationRoutes...
)
}

但是内置的 append() 能够附加两个 slice ,因此它会在编译时抛出 太多参数来附加。是否有替代功能来完成任务?还是有更好的方法来合并 slice ?

最佳答案

这个问题已经回答了,但我想在这里发布这个问题,因为接受的答案不是最有效的。

原因是创建一个空 slice 然后追加会导致许多不必要的分配。

最有效的方法是预先分配一个 slice 并将元素复制到其中。下面是一个以两种方式实现连接的包。如果您进行基准测试,您会发现预分配速度快了约 2 倍,并且分配的内存要少得多。

基准测试结果:

go test . -bench=. -benchmem
testing: warning: no tests to run
BenchmarkConcatCopyPreAllocate-8 30000000 47.9 ns/op 64 B/op 1 allocs/op
BenchmarkConcatAppend-8 20000000 107 ns/op 112 B/op 3 allocs/op

包连接:

package concat

func concatCopyPreAllocate(slices [][]byte) []byte {
var totalLen int
for _, s := range slices {
totalLen += len(s)
}
tmp := make([]byte, totalLen)
var i int
for _, s := range slices {
i += copy(tmp[i:], s)
}
return tmp
}

func concatAppend(slices [][]byte) []byte {
var tmp []byte
for _, s := range slices {
tmp = append(tmp, s...)
}
return tmp
}

基准测试:

package concat

import "testing"

var slices = [][]byte{
[]byte("my first slice"),
[]byte("second slice"),
[]byte("third slice"),
[]byte("fourth slice"),
[]byte("fifth slice"),
}

var B []byte

func BenchmarkConcatCopyPreAllocate(b *testing.B) {
for n := 0; n < b.N; n++ {
B = concatCopyPreAllocate(slices)
}
}

func BenchmarkConcatAppend(b *testing.B) {
for n := 0; n < b.N; n++ {
B = concatAppend(slices)
}
}

关于go - 在golang中连接多个 slice ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37884361/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com