Im Go ist ein string
ein primitiver Typ, was bedeutet, dass er schreibgeschützt ist und jede Manipulation einen neuen String erstellt.
Also, wenn ich Strings viele Male hintereinander verketten möchte, ohne die Länge des resultierenden Strings zu kennen, wie mache ich das am besten?
Der naive Ansatz wäre:
var s string
for i := 0; i < 1000; i++ {
s += getShortStringFromSomewhere()
}
return s
aber das scheint nicht sehr effizient zu sein.
12 Stimmen
Noch eine Bank
1 Stimmen
Hinweis: Diese Frage und die meisten Antworten scheinen vor dem Hinzufügen von
append()
in die Sprache geschrieben worden zu sein, was eine gute Lösung dafür ist. Es wird genauso schnell wiecopy()
ausgeführt, aber das Slice wird zuerst erweitert, auch wenn dies bedeutet, dass ein neues zugrundeliegendes Array allokiert wird, wenn die Kapazität nicht ausreicht.bytes.Buffer
macht immer noch Sinn, wenn Sie seine zusätzlichen Komfortmethoden möchten oder wenn das Paket, das Sie verwenden, dies erwartet.10 Stimmen
Es ist nicht nur "sehr ineffizient"; es hat ein spezifisches Problem, mit dem jeder neue Nicht-CS-Mitarbeiter, den wir jemals eingestellt haben, in den ersten Wochen der Arbeit konfrontiert wird. Es ist quadratisch - O(n*n). Denken Sie an die Zahlenfolge:
1 + 2 + 3 + 4 + ...
. Es istn*(n+1)/2
, die Fläche eines Dreiecks mit der Basisn
. Sie reservieren die Größe 1, dann die Größe 2, dann die Größe 3 usw., wenn Sie unveränderliche Strings in einer Schleife anhängen. Diese quadratische Ressourcenverwendung äußert sich auf mehrere Weisen als nur diese.