Heim >Backend-Entwicklung >Golang >Ändern Sie Werte in einer Kopie eines Slice und hängen Sie sie an das Original-Slice an
In PHP ist Slice eine häufig verwendete Datenstruktur, die es uns ermöglicht, einen Teil der Elemente aus einem Array oder Slice auszuwählen. Manchmal müssen wir jedoch das Slice ändern und den geänderten Wert an das ursprüngliche Slice anhängen. Dieser Vorgang ist in PHP möglich, indem der Wert in der Slice-Kopie geändert und die geänderte Kopie dann mithilfe der Funktion array_splice an das Original-Slice angehängt wird. In diesem Artikel erfahren Sie, wie Sie mit dieser Methode Slice-Modifikationen und Anhängeoperationen implementieren.
Schreiben Sie eine Funktion, die ein Slice kopiert, die Werte der Elemente in der Slice-Kopie ändert und dann die Kopie an die Originalkopie anhängt. Es sieht so aus, als würde der Code nicht nur die Kopie des Slice ändern, sondern auch das Original-Slice.
Geh auf den Spielplatz
import "fmt" type item struct { name string number int } func main() { names := []string{"a", "b"} numbers := []int{1, 2} items := []*item{} for _, name := range names { item := &item{name: name} items = append(items, item) } for n, i := range numbers { if n > 0 { fmt.println(n, "make a copy of the items") itemcopies := make([]*item, len(items)) copy(itemcopies, items) fmt.println(n, "set the numbers on the copies") for _, item := range itemcopies { item.number = i } fmt.println(n, "append the copies to the original") items = append(items, itemcopies...) } else { fmt.println(n, "first pass set all the items to the first number") for _, item := range items { item.number = i } } } for n, i := range items { fmt.printf("%d %+v\n", n, *i) } }
Was ich tatsächlich gesehen habe
0 {name:a number:2} 1 {name:b number:2} 2 {name:a number:2} 3 {name:b number:2}
Was erwarte ich zu sehen
0 {name:a number:1} 1 {name:b number:1} 2 {name:a number:2} 3 {name:b number:2}
@jimb hat recht, du kopierst den Zeiger,
Ich schlage vor, eine Kopierfunktion, die zum Strukturelement gehört zu definieren, um eine neue Kopie zu erstellen
package main import "fmt" type Item struct { name string number int } func (it *Item) copy() *Item { return &Item{ name: it.name, number: it.number, } } func main() { names := []string{"a", "b"} numbers := []int{1, 2} items := []*Item{} for _, name := range names { item := &Item{name: name} items = append(items, item) } for n, i := range numbers { if n > 0 { fmt.Println(n, "make a copy of the items") itemCopies := make([]*Item, len(items)) for j := 0; j < len(items); j++ { itemCopies[j] = items[j].copy() } fmt.Println(n, "set the numbers on the copies") for _, item := range itemCopies { item.number = i } fmt.Println(n, "append the copies to the original") items = append(items, itemCopies...) } else { fmt.Println(n, "first pass set all the items to the first number") for _, item := range items { item.number = i } } } for n, i := range items { fmt.Printf("%d %+v\n", n, *i) } }
Das obige ist der detaillierte Inhalt vonÄndern Sie Werte in einer Kopie eines Slice und hängen Sie sie an das Original-Slice an. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!