Slice von Strings in Slice von Zeigern in Strings umwandeln
Das Ziel dieser Aufgabe ist es, ein Slice von Strings in ein Slice mit Inhalten umzuwandeln Zeiger auf jede dieser Zeichenfolgen. Sehen wir uns ein konkretes Beispiel an:
values1 := []string{"a", "b", "c"} var values2 []*string for _, v := range values1 { fmt.Printf("%p | %T\n", v, v) values2 = append(values2, &v) } fmt.Println(values2)
Anfängliche Verwirrung
Es mag kontraintuitiv erscheinen, dass v, obwohl es sich um eine Zeichenfolge handelt, während der gesamten Schleife an derselben Speicheradresse bleibt . Dies liegt daran, dass v in diesem Fall kein Zeiger auf eine Zeichenfolge ist, sondern vielmehr eine Kopie jeder Zeichenfolge in Werten1.
Zwei mögliche Lösungen
Lösung 1:
for i, _ := range values1 { values2 = append(values2, &values1[i]) }
Diese Methode hängt Zeiger auf die Elemente im ursprünglichen Slice „values1“ korrekt an „values2“ an. Es ist jedoch wichtig zu beachten, dass Werte2 jetzt Adressen enthält, die direkt auf Werte1 verweisen, sodass Werte1 im Speicher bleiben, solange Werte2 vorhanden sind.
Lösung 2:
for _, v := range values1 { v2 := v values2 = append(values2, &v2) }
Diese alternative Lösung erstellt für jede Iteration eine temporäre lokale Variable (v2), weist ihr den Wert von v zu und hängt dann einen Zeiger auf v2 an Werte2 an. Dadurch wird sichergestellt, dass Werte1 unabhängig von Werten2 ist und alle Änderungen an Werten1 keine Auswirkungen auf Werte2 haben.
Das obige ist der detaillierte Inhalt vonWie konvertiere ich in Go ein Stück Strings in ein Stück String-Zeiger?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!