Heim > Backend-Entwicklung > Golang > Wie bleiben die ursprünglichen Speicheradressen erhalten, wenn ein Go-Slice mit Strings in ein Slice mit String-Zeigern konvertiert wird?

Wie bleiben die ursprünglichen Speicheradressen erhalten, wenn ein Go-Slice mit Strings in ein Slice mit String-Zeigern konvertiert wird?

Patricia Arquette
Freigeben: 2024-12-26 11:09:14
Original
442 Leute haben es durchsucht

How to Preserve Original Memory Addresses When Converting a Go Slice of Strings to a Slice of String Pointers?

Beibehaltung der Bezeichneradresse bei der Slice-Konvertierung

Konvertieren eines Segments von Zeichenfolgen (Werte1) in ein Segment von Zeigern auf Zeichenfolgen (Werte2) in Go ) stellt eine einzigartige Herausforderung dar. Der unten bereitgestellte Code veranschaulicht das Problem:

values1 := []string{"a", "b", "c"}
var values2 []*string
for _, v := range values1 {
    fmt.Printf("%p | %T\n", v, v)
    values2 = append(values2, &v)
}
Nach dem Login kopieren

Erwartungsgemäß zeigt die Ausgabe, dass jedes Element in „values2“ auf dieselbe Speicheradresse verweist, obwohl es unterschiedliche Werte hat. Dies liegt daran, dass die Bereichsschleifenvariable v eine Kopie des ursprünglichen Zeichenfolgenwerts und kein Zeiger darauf ist. Infolgedessen bleibt v ein Zeichenfolgenwert, auch wenn innerhalb der Schleife ein neuer Wert zugewiesen wird.

Lösungsimplementierung

Um dieses Problem zu beheben, müssen wir die Adresse anhängen der ursprünglichen Slice-Elemente auf Werte2. Hier sind zwei mögliche Lösungen:

1. Indizieren des Original-Slice

for i, _ := range values1 {
    values2 = append(values2, &values1[i])
}
Nach dem Login kopieren

Durch den Zugriff auf die Slice-Elemente durch Indizierung erhalten wir die gewünschten Zeigeradressen und bewahren ihre eindeutigen Werte.

2. Verwendung temporärer Variablen

for _, v := range values1 {
    v2 := v
    values2 = append(values2, &v2)
}
Nach dem Login kopieren

Bei diesem Ansatz deklarieren wir eine temporäre Variable (v2), um jeden String-Wert zu speichern. Indem wir v2 &v2 zuweisen, erstellen wir einen unabhängigen Zeigerwert, der sicherstellt, dass Werte2 eindeutige Zeiger enthält.

Auswirkungen der Beibehaltung der Bezeichneradresse

Es ist wichtig zu beachten, dass die Beibehaltung der Bezeichneradresse Adressen hat bestimmte Auswirkungen:

  • Das Hintergrundarray mit Werten1 bleibt so lange im Speicher erhalten da sowohl Werte1 als auch Werte2 erreichbar sind.
  • Änderungen an Werten1-Elementen werden in Werten2 widergespiegelt.
  • Um zu verhindern, dass Werte1 durch Garbage Collection erfasst werden, verwenden Sie entweder Indizierung oder temporäre Variablen, wie in den Lösungen beschrieben oben.

Das obige ist der detaillierte Inhalt vonWie bleiben die ursprünglichen Speicheradressen erhalten, wenn ein Go-Slice mit Strings in ein Slice mit String-Zeigern konvertiert wird?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage