String-Manipulation in Go, im Gegensatz zu Sprachen wie Python oder Ruby umfasst die Verarbeitung von Zeigern auf Zeichenfolgendaten. Im bereitgestellten Codebeispiel möchten wir eine Datenstruktur erstellen, die Bild-Tags einer Liste von Bild-URLs zuordnet. Der naive Ansatz beinhaltet jedoch das Kopieren von Zeichenfolgenwerten nach Wert, was zu Speicherineffizienz führen kann, wenn die Datenstruktur groß wird.
Die erste Lösung verwendet Zeiger auf Bild-URLs Zeichenfolgen, anstatt sie nach Wert zu kopieren. Dieser Ansatz hat jedoch Einschränkungen:
Um eine optimale Speichernutzung zu erreichen, müssen wir berücksichtigen, dass String-Werte in Go im Wesentlichen Zeiger sind. Durch das Speichern eines Zeichenfolgewerts wird unabhängig von der Länge eine 16-Byte-Struktur kopiert. Durch die Verwendung von String-Pools oder „Internern“ können wir das Auftreten von Strings verfolgen und vorhandene String-Deskriptoren wiederverwenden, anstatt neue zu erstellen.
Unsere Lösung umfasst einen einfachen String-Interner, der Strings zwischenspeichert Werte und gibt den vorhandenen Deskriptor zurück, wenn ein Duplikat gefunden wird. Durch das „Internieren“ von Zeichenfolgen stellen wir sicher, dass alle Vorkommen desselben Zeichenfolgenwerts auf einen einzelnen Zeichenfolgendeskriptor verweisen, wodurch der Speicherverbrauch minimiert wird.
Der resultierende Code folgt:
<code class="go">result := searchImages() tagToUrlMap := make(map[string][]string) for _, image := range result { imageURL := interned(image.URL) for _, tag := range image.Tags { tagName := interned(tag.Name) tagToUrlMap[tagName] = append(tagToUrlMap[tagName], imageURL) } } // Clear the interner cache: cache = nil</code>
Diese Lösung minimiert die Speichernutzung durch die Verwendung von String-Internierung, ohne übermäßige Komplexität einzuführen.
Das obige ist der detaillierte Inhalt vonWie kann String Interning die Speichernutzung in Go-Datenstrukturen optimieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!