Heim > Backend-Entwicklung > Golang > Wie kann man Slice-Mitglieder mit Unveränderlichkeit verfügbar machen?

Wie kann man Slice-Mitglieder mit Unveränderlichkeit verfügbar machen?

PHPz
Freigeben: 2024-02-09 09:20:11
nach vorne
657 Leute haben es durchsucht

Wie kann man Slice-Mitglieder mit Unveränderlichkeit verfügbar machen?

Der PHP-Editor Apple stellt Ihnen vor, wie Sie Slice-Mitglieder mit Unveränderlichkeit verfügbar machen. In der Programmierung bezieht sich Slicing auf den Vorgang des Abfangens eines Teils von Elementen oder Zeichen aus einem Array oder einer Zeichenfolge. Normalerweise gibt ein Slicing-Vorgang ein neues Array oder einen neuen String zurück, aber manchmal möchten wir das ursprüngliche Array oder den ursprünglichen String unverändert lassen und nur einige Mitglieder des Slice verfügbar machen. Dadurch können Sie die Leistung und Speichernutzung Ihres Programms verbessern. Als Nächstes erklären wir Ihnen, wie Sie dies bewerkstelligen.

Frageninhalt

Ich habe eine Struktur mit einem Slice-Mitglied und eine Methode, die dieses Slice verfügbar macht. Aber ich möchte nicht, dass der Anrufer den Inhalt des Slice ändern kann. Wenn ja:

type a struct {
    slice []int
}

func (a *a) list() []int {
    return a.slice
}
Nach dem Login kopieren

Es ist nicht sicher, da der Inhalt leicht geändert werden kann:

a := a{[]int{1, 2, 3}}
_ = append(a.list()[:2], 4)
fmt.println(a.list()) // [1 2 4]
Nach dem Login kopieren

Natürlich kann ich list() eine Kopie des Slice zurücksenden, um dies zu vermeiden:

func (a *A) list() []int {
    return append([]int{}, a.slice...)
}
Nach dem Login kopieren
Das bedeutet aber, dass ich jedes Mal eine Kopie erstelle, wenn ich nur über den Slice iterieren möchte, was verschwenderisch erscheint. Gibt es eine Möglichkeit, dies ohne unnötiges Kopieren zu tun?

Problemumgehung

Sobald Sie das Slice einem externen Anrufer durch Rückgabe zur Verfügung gestellt haben, können Sie es ändern. Wenn das Kopieren aus Leistungsgründen nicht akzeptiert wird, können Sie Besucher implementieren:

func (a *a) visit(f func(int)) {
    for _, v := range a.slice {
        f(v)
    }
}
Nach dem Login kopieren

Dadurch wird das Slice überhaupt nicht verfügbar gemacht und der Client-Code kann alle Elemente im Slice gleichzeitig anzeigen. Wenn es sich bei den Elementen nicht um Zeiger oder andere veränderbare Typen handelt, ist dies effektiv schreibgeschützt, da der Besucherrückruf eine Kopie des Werts erhält.

Wenn Sie die Iteration vorzeitig stoppen möchten, kann der Besucher einen booleschen Wert zurückgeben (optional).

func (a *A) Visit(f func(int) bool) {
    for _, v := range a.slice {
        if !f(v) {
            return
        }
    }
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie kann man Slice-Mitglieder mit Unveränderlichkeit verfügbar machen?. 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