Wiederverwendung von Speicheradressen beim Kopieren aus Golang-Slices
Ein häufiges Missverständnis bei der Go-Programmierung dreht sich um das Kopieren von Speicheradressen aus Slices. Stellen Sie sich die folgende Situation vor:
Sie haben eine Model-Schnittstelle und eine Region-Struktur, die sie implementiert. Die Schnittstelle wird auf dem Zeiger der Region-Struktur implementiert. Sie verfügen außerdem über eine Regions-Sammlung, bei der es sich um einen Ausschnitt aus Region-Objekten handelt. Sie verfügen über eine Methode zum Konvertieren eines Regions-Objekts in ein []Modell:
// Regions is the collection of the Region model type Regions []Region // Returns the model collection as a list of models func (coll *Regions) ToModelList() []Model { output := make([]Model, len(*coll)) for idx, item := range *coll { output[idx] = &item } return output }
Wenn Sie diesen Code ausführen, würden Sie erwarten, dass Sie für jedes Modell im Ausgabe-Slice unterschiedliche Adressen erhalten. Am Ende wird jedoch der erste Zeiger auf die Region mehrmals ausgegeben.
Um dieses Problem zu beheben, betrachten Sie das Schleifenvariablenelement in der ursprünglichen Methode. Es ist für jede Iteration der Schleife dasselbe, sodass das resultierende Slice Verweise auf dieselben zugrunde liegenden Daten enthält.
Die Arbeitslösung hingegen verwendet i := (*coll)[idx] to Erstellen Sie für jede Iteration eine neue Variable. Dadurch wird sichergestellt, dass jedes Modell im Ausgabe-Slice eine eindeutige Speicheradresse hat.
Zum besseren Verständnis betrachten Sie den folgenden Codeausschnitt:
func main() { coll := []int{5, 10, 15} for i, v := range coll { fmt.Printf("This one is always the same; %v\n", &v) fmt.Println("This one is 4 bytes larger each iteration; %v\n", &coll[i]) } }
Dieser Code zeigt, dass die Speicheradresse von v bleibt während der gesamten Schleife gleich, während die Speicheradresse von coll[i] mit jeder Iteration zunimmt. Dieses Verhalten ist darauf zurückzuführen, dass v die Schleifenvariable ist, die konstant bleibt, während coll[i] für jede Iteration eine neue Variable ist.
Das obige ist der detaillierte Inhalt vonWarum führt das Kopieren von einem Go-Slice zur Wiederverwendung von Speicheradressen und wie kann dies behoben werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!