Bevorzugen Sie strconv vor fmt

Bei der Konvertierung von Primitiven in Strings oder von Strings in Primitiven ist strconv schneller als fmt.

Nicht empfohlen:

for i := 0; i < b.N; i++ {
  s := fmt.Sprint(rand.Int())
}

Empfohlen:

for i := 0; i < b.N; i++ {
  s := strconv.Itoa(rand.Int())
}

Vermeiden Sie die Konvertierung von Strings in Bytes

Vermeiden Sie es, wiederholt einen Byte-Slice aus einem festen String zu erstellen. Statt dessen führen Sie die Konvertierung einmal durch und erfassen das Ergebnis.

Nicht empfohlen:

for i := 0; i < b.N; i++ {
  w.Write([]byte("Hello world"))
}

Empfohlen:

data := []byte("Hello world")
for i := 0; i < b.N; i++ {
  w.Write(data)
}

Container-Kapazität angeben

Geben Sie, wenn möglich, die Container-Kapazität an, um Speicher für den Container vorab zuzuweisen. Dies minimiert spätere Allokationen (durch Kopieren und Anpassen der Containergröße) beim Hinzufügen von Elementen.

Hinweis zur Map-Kapazität

Geben Sie in den meisten Fällen Kapazitätsinformationen bei der Initialisierung mit make() an.

make(map[T1]T2, hinweis)

Durch die Bereitstellung eines Kapazitätshinweises an make() wird versucht, die Zuweisung der Map bei der Initialisierung zu verkleinern, um Speicherneuzuweisungen beim Hinzufügen von Elementen zur Map zu minimieren.

Beachten Sie, dass im Gegensatz zu Slices ein Kapazitätshinweis für eine Map keine vollständige Vorzuweisung garantiert, sondern dazu dient, die Anzahl der für die HashMap-Buckets erforderlichen Schätzungen zu machen. Daher kann es bei der Hinzufügung von Elementen zur Map auch bei Angabe einer Map-Kapazität zu einer Allokation kommen.

Nicht empfohlen:

m := make(map[string]os.FileInfo)

files, _ := os.ReadDir("./files")
for _, f := range files {
    m[f.Name()] = f
}

// m wird ohne Größenhinweis erstellt; es kann während der Laufzeit zu weiteren Allokationen kommen.

Empfohlen:

files, _ := os.ReadDir("./files")

m := make(map[string]os.FileInfo, len(files))
for _, f := range files {
    m[f.Name()] = f
}

// m wird mit einem Größenhinweis erstellt; es kann während der Laufzeit zu weniger Allokationen kommen.

Slice-Kapazität angeben

Geben Sie in den meisten Fällen Kapazitätsinformationen bei der Initialisierung eines Slices mit make() an, insbesondere beim Anhängen an den Slice.

make([]T, länge, kapazität)

Anders als bei Maps ist eine Slice-Kapazität nicht nur ein Hinweis: Der Compiler wird bei der Verwendung von make() genügend Speicher für die bereitgestellte Slice-Kapazität zuweisen, was bedeutet, dass nachfolgende append()-Operationen zu keiner Allokation führen (bis die Länge des Slices mit seiner Kapazität übereinstimmt, nach welcher ein Anfügen eine Größenanpassung zur Aufnahme zusätzlicher Elemente bewirken kann).

Nicht empfohlen:

for n := 0; n < b.N; n++ {
  data := make([]int, 0)
  for k := 0; k < size; k++{
    data = append(data, k)
  }
}

Empfohlen:

for n := 0; n < b.N; n++ {
  data := make([]int, 0, size)
  for k := 0; k < size; k++{
    data = append(data, k)
  }
}