Einfache und leicht verdauliche Lösung. Details in den Kommentaren. Kopie überschreibt die Elemente des Slices. Wir schneiden ein einzelnes Element und überschreiben es.
package main
import (
"fmt"
)
var N int = 100000
func main() {
slice1 := make([]rune, N, N)
//Effizient mit schneller Leistung, benötigt vorkonfigurierten Speicher
//Wir können überprüfen, ob wir die Grenze erreicht haben, dann die Kapazität erhöhen
//mit append, aber Strafe für das Kopieren von Daten in ein neues Array. Auch append erfolgt nach der Länge des aktuellen Slices.
for i := 0; i < N; i++ {
copy(slice1[i:i+1], []rune{'N'})
}
fmt.Println(slice1)
//Einfache, aber schnelle Lösung. Jedes Mal, wenn die Kapazität des Slices erreicht ist, erhalten wir eine Strafe für den Aufwand, der beim Kopieren der Daten in ein neues Array entsteht
slice2 := []rune{}
for i := 0; i <= N; i++ {
slice2 = append(slice2, 'N')
}
fmt.Println(slice2)
}
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.