code referenced by the commentは、書かれているようにメモリ効率が良いです。どの割り当てもメモリ割り当てを最小限に抑えるために書かれたstrings.Join
にあります。
私はコメントが偶然このcode in the net/http packageからコピー&ペーストしている疑いがある:
// TODO: could do better allocation-wise here, but trailers are rare,
// so being lazy for now.
if _, err := io.WriteString(w, "Trailer: "+strings.Join(keys, ",")+"\r\n"); err != nil {
return err
}
このスニペットは、以下の可能性の割り当てがありますため
よりメモリ効率的なアプローチは、書き込まれるデータのための単一[]byte
を割り当てることです。
n := len("Trailer: ") + len("\r\n")
for _, s := range keys {
n += len(s) + 1
}
p := make([]byte, 0, n-1) // subtract 1 for len(keys) - 1 commas
p = append(p, "Trailer: "...)
for i, s := range keys {
if i > 0 {
p = append(p, ',')
}
p = append(p, s...)
}
p = append(p, "\r\n"...)
w.Write(p)
具体的にリンクを参照するのではなく、 'strings.Join()'は、連結のために多くの割り当てとコピーを行います。大きな文字列の場合、これはBuffer/'io.Writer'のような他のアプローチと比べて高価になります。 – Nadh