Ändern Sie Werte in einer Kopie eines Slice und hängen Sie sie an das Original-Slice an

PHPz
Freigeben: 2024-02-09 16:36:07
nach vorne
377 Leute haben es durchsucht

Ä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.

Frageninhalt

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)
    }
}
Nach dem Login kopieren

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}
Nach dem Login kopieren

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}
Nach dem Login kopieren

Lösung

@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)
    }
}
Nach dem Login kopieren

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!

Quelle:stackoverflow.com
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!