Explication détaillée du package de chaînes dans Golang (1) : strings.Builder

strings.Builder

strings.Builder est un type utilisé dans Golang pour créer efficacement des chaînes. Il utilise un tampon circulaire pour stocker les données de caractères, évitant les opérations fréquentes d'allocation de mémoire et de copie, et est particulièrement adapté aux scénarios où les chaînes sont fréquemment concaténées. La définition de la structure et les méthodes correspondantes sont les suivantes :

type Builder struct {
  addr *Builder // of receiver, to detect copies by value
	buf  []byte
}

func (b *Builder) Grow(n int)
func (b *Builder) Len() int
func (b *Builder) Cap() int
func (b *Builder) Reset()
func (b *Builder) String() string
func (b *Builder) Write(p []byte) (int, error)
func (b *Builder) WriteByte(c byte) error
func (b *Builder) WriteRune(r rune) (int, error)
func (b *Builder) WriteString(s string) (int, error)

Parmi les méthodes les plus couramment utilisées, citons :

  • Reset() : Réinitialise le contenu de la chaîne dans le Builder, afin que le Builder puisse régénérer une nouvelle chaîne.
  • WriteString(s string) (int, error) : ajoute une chaîne au générateur et renvoie la longueur de la chaîne ajoutée et les erreurs possibles.
  • String() string : Renvoie la chaîne générée dans le Builder.

Avantage

Comme dans de nombreux langages, le type de chaîne dans Golang est également immuable. Si vous souhaitez obtenir une autre chaîne basée sur une chaîne, vous ne pouvez effectuer que l'interception et le raccordement en fonction de cette chaîne. Les expressions de découpage peuvent être utilisées pour l'interception et le raccordement peut être utilisé. l'opérateur "+" pour y parvenir.

S'il y a un grand nombre d'expressions de tranche et d'opérateurs "+" utilisés pour l'interception et l'épissage dans le code, une allocation de mémoire fréquente sera provoquée. Au niveau de la couche inférieure, une valeur de type chaîne sera stockée dans un espace mémoire continu.Le contenu de cette mémoire peut être considéré comme un tableau d'octets, et la valeur de chaîne contient une valeur de pointeur pointant vers la tête du tableau d'octets. tranche La chaîne d'opération d'expression équivaut à découper le tableau d'octets sous-jacent. De toute évidence, un grand nombre d'opérations de concaténation de chaînes entraînera une forte pression d'allocation de mémoire.

Exemple d'utilisation

Un exemple d'utilisation simple est le suivant :

package main

import (
	"fmt"
	"strings"
)

func main() {
	var builder strings.Builder    // 声明一个 Builder 变量
	builder.WriteString("Hello, ") // 追加字符串
	builder.WriteString("world!")  // 追加字符串
	fmt.Println(builder.String())  // 输出结果
}

La sortie est :

Hello, world!

Créez d'abord un générateur d'objet strings.Builder, puis utilisez la méthode WriteString pour écrire une chaîne dans le tampon, et enfin utilisez la méthode String pour convertir les données de caractères dans le tampon en une chaîne.

résumé

Pour les scénarios où un grand nombre de chaînes sont concaténées, il est recommandé d'utiliser strings.Builder au lieu d'utiliser directement l'opérateur "+" pour concaténer les chaînes afin d'éviter les problèmes fréquents d'allocation de mémoire. Lorsque vous utilisez l'objet strings.Builder, si vous souhaitez le réutiliser, vous pouvez utiliser la méthode Reset() pour effacer les chaînes dans le Builder. Si vous avez besoin d'un certain espace de cache lorsque vous utilisez strings.Builder pour concaténer des chaînes, vous pouvez utiliser la méthode Grow(n int) pour pré-allouer de la mémoire afin d'améliorer l'efficacité d'exécution du programme. Par exemple:

var builder strings.Builder
builder.Grow(1024) // 预分配 1K 内存空间

Guess you like

Origin blog.csdn.net/luduoyuan/article/details/131236655