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

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

PHPz
PHPznach vorne
2024-02-09 09:20:11652Durchsuche

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
}

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]

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...)
}
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)
    }
}

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
        }
    }
}

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen