Heim >Backend-Entwicklung >Golang >Wie kann ich mithilfe von Zeigern in Go Tags effizient Bild-URLs zuordnen und gleichzeitig eine ordnungsgemäße Speicherbereinigung sicherstellen?

Wie kann ich mithilfe von Zeigern in Go Tags effizient Bild-URLs zuordnen und gleichzeitig eine ordnungsgemäße Speicherbereinigung sicherstellen?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-10-28 17:28:29627Durchsuche

 How can I efficiently map tags to image URLs using pointers in Go while ensuring proper garbage collection?

Garbage Collection und korrekte Verwendung von Zeigern in Go

Problem:

Sie sind Sie arbeiten mit einer Sprache mit einer anderen Datenstruktur, z. B. Python, und möchten auf Go migrieren. Sie sind sich nicht sicher, wie Sie Zeiger in einem Go-Programm richtig nutzen.

Konkret liegt eine Situation vor, in der:

  • Sie haben eine große JSON-Antwort mit Bilddaten und entsprechenden Tags.
  • Sie müssen in Go eine Datenstruktur erstellen, um jedes Tag einer Liste von Bild-URLs zuzuordnen.
  • Sie möchten Zeiger verwenden, um die Speichernutzung zu optimieren.

Frage:

Wie können Sie Zeiger effektiv verwenden, um Tags Bild-URLs in einem Go-Programm zuzuordnen? Welche Überlegungen sollten getroffen werden, um eine ordnungsgemäße Speicherbereinigung und Speicherverwaltung sicherzustellen?

Antwort:

1. Vermeiden Sie das Speichern von Zeigern auf Felder:

  • Es ist zwar möglich, Zeiger auf bestimmte Felder innerhalb einer Struktur zu speichern, dies wird jedoch nicht empfohlen.
  • Die gesamte Struktur wird als gespeichert solange der Zeiger aktiv ist, auch wenn Sie nur ein bestimmtes Feld benötigen.
  • Dies kann zu unerwünschter Speicherfragmentierung führen.

2. String-Werte verhalten sich wie Zeiger:

  • String-Werte in Go werden durch kleine Strukturen namens reflect.StringHeader dargestellt, die einen Zeiger auf die tatsächlichen String-Daten enthalten.
  • Wenn Sie einen String übergeben oder kopieren, übergeben oder kopieren Sie im Wesentlichen diese reflect.StringHeader-Struktur, nicht die gesamten String-Daten.
  • Das bedeutet, dass String-Werte bereits wie Zeiger wirken.

3. Verwenden Sie einen String-Interner:

  • Um den Speicher weiter zu optimieren, verwenden Sie einen String-Interner, um zu verhindern, dass mehrere Kopien desselben String-Werts erstellt werden.
  • Dadurch wird sichergestellt, dass nur eine einzige Instanz vorhanden ist Jeder eindeutige String wird im Speicher gespeichert.
  • Sobald der Interner nicht mehr benötigt wird, können Sie seinen Cache leeren, um die darin enthaltenen Strings freizugeben.

Beispielcode:

<code class="go">package main

import (
    "encoding/json"
    "fmt"
    "os"
    "reflect"
)

type Image struct {
    URL        string
    Description string
    Tags        []*Tag
}

type Tag struct {
    Name string
    Rank int
}

// this function mimics json.NewDecoder(resp.Body).Decode(&amp;parsedJSON)
func searchImages() []*Image {
    parsedJSON := []*Image{
        &amp;Image{
            URL:        "https://c8.staticflickr.com/4/3707/11603200203_87810ddb43_o.jpg",
            Description: "Ocean islands",
            Tags: []*Tag{
                &amp;Tag{"ocean", 1},
                &amp;Tag{"water", 2},
                &amp;Tag{"blue", 3},
                &amp;Tag{"forest", 4},
            },
        },
        &amp;Image{
            URL:        "https://c3.staticflickr.com/1/48/164626048_edeca27ed7_o.jpg",
            Description: "Bridge over river",
            Tags: []*Tag{
                &amp;Tag{"bridge", 1},
                &amp;Tag{"river", 2},
                &amp;Tag{"water", 3},
                &amp;Tag{"forest", 4},
            },
        },
    }
    return parsedJSON
}

func main() {
    result := searchImages()

    cache := map[string]string{}

    tagToUrlMap := make(map[string][]string)

    for _, image := range result {
        imageURL := intern(image.URL, cache)

        for _, tag := range image.Tags {
            tagName := intern(tag.Name, cache)
            tagToUrlMap[tagName] = append(tagToUrlMap[tagName], imageURL)
        }
    }

    cache = nil

    enc := json.NewEncoder(os.Stdout)
    enc.SetIndent("", "  ")
    if err := enc.Encode(tagToUrlMap); err != nil {
        panic(err)
    }
}

func intern(s string, cache map[string]string) string {
    if s2, ok := cache[s]; ok {
        return s2
    }

    // New string, store it
    cache[s] = s
    return s
}</code>

Zusätzliche Ressourcen:

  • [Zeiger in Go](https://go.dev/blog/pointers): An Einführung in Zeiger in Go.
  • [Effective Go](https://go.dev/doc/ Effective_go): Eine Anleitung zum Schreiben von idiomatischem Go-Code.
  • [Garbage Collection in Go] (https://dave.cheney.net/2013/06/03/garbage-collection-in-go): Eine detaillierte Erklärung der Garbage Collection in Go.

Das obige ist der detaillierte Inhalt vonWie kann ich mithilfe von Zeigern in Go Tags effizient Bild-URLs zuordnen und gleichzeitig eine ordnungsgemäße Speicherbereinigung sicherstellen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn