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) }
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]) }
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) }
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 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!