2 回答

TA貢獻(xiàn)1909條經(jīng)驗(yàn) 獲得超7個(gè)贊
bytes.Join()非???,但它做了一些額外的工作,在可附加的字節(jié)片之間附加分隔符。即使分隔符為空或nil切片,它也會(huì)這樣做。
因此,如果您關(guān)心最佳性能(盡管它會(huì)略有改進(jìn)),您可以bytes.Join()在不附加(空)分隔符的情況下執(zhí)行以下操作:分配一個(gè)足夠大的字節(jié)切片,并使用內(nèi)置的將每個(gè)切片復(fù)制到結(jié)果中copy()功能。
在Go Playground上試試:
func Join(s ...[]byte) []byte {
n := 0
for _, v := range s {
n += len(v)
}
b, i := make([]byte, n), 0
for _, v := range s {
i += copy(b[i:], v)
}
return b
}
使用它:
concatenated := Join(d1, d2, d3, d4)
改進(jìn):
如果您事先知道總大?。ɑ蛘吣梢员妊h(huán)切片更快地計(jì)算它),提供它,您可以避免必須循環(huán)切片以計(jì)算所需的大小:
func JoinSize(size int, s ...[]byte) []byte {
b, i := make([]byte, size), 0
for _, v := range s {
i += copy(b[i:], v)
}
return b
}
在您的情況下使用它:
concatenated := JoinSize(48 + len(d4), d1, d2, d3, d4)
筆記:
但是,如果您最終的目標(biāo)是將連接的字節(jié)切片寫入一個(gè)io.Writer,性能方面最好不要連接它們,而是將每個(gè)切片單獨(dú)寫入。

TA貢獻(xiàn)1966條經(jīng)驗(yàn) 獲得超4個(gè)贊
總的來說,@icza 的回答是正確的。但是,對(duì)于您的特定用例,您可以分配一次并更有效地解碼到該緩沖區(qū):
像這樣:
package main
import (
"encoding/hex"
)
func main() {
h1 := []byte("6e5438fd9c3748868147d7a4f6d355dd")
h2 := []byte("0740e2dfa4b049f2beeb29cc304bdb5f")
h3 := []byte("ab6743272358467caff7d94c3cc58e8c")
h4 := []byte("7411c080762a47f49e5183af12d87330e6d0df7dd63a44808db4e250cdea0a36182fce4a309842e49f4202eb90184dd5b621d67db4a04940a29e981a5aea59be")
tg := make([]byte, 16+16+16+(1024*1024)) // allocate enough space for the 3 IDs and a max 1MB of extra data
hex.Decode(tg[:16], h1)
hex.Decode(tg[16:32], h2)
hex.Decode(tg[32:48], h3)
l, _ := hex.Decode(tg[48:], h4)
tg = tg[:48+l]
}
在該代碼的末尾,tg保存 3 個(gè) ID 加上可變長(zhǎng)度的第 4 個(gè)數(shù)據(jù)塊,連續(xù)解碼。
- 2 回答
- 0 關(guān)注
- 555 瀏覽
添加回答
舉報(bào)