Sollte ich eine Kopie für private Slice-Felder verwenden, bevor ich sie vom Getter zurückgebe?

WBOY
Freigeben: 2024-02-09 16:30:10
nach vorne
732 Leute haben es durchsucht

在从 getter 返回私有切片字段之前,是否应该对它们使用复制?

Bei der objektorientierten Programmierung wird normalerweise die Getter-Methode verwendet, um den Wert einer privaten Mitgliedsvariablen zu erhalten. Manchmal stellt sich jedoch die Frage: Sollte ich private Slice-Felder kopieren, bevor ich sie von der Getter-Methode zurückgebe? Die Antwort auf diese Frage ist nicht absolut und hängt von den konkreten Umständen ab. In einigen Fällen kann das Kopieren eines privaten Slice-Felds verhindern, dass externer Code das Feld ändert, wodurch die Datenkonsistenz und -sicherheit geschützt wird. In einigen Szenarien mit hohen Leistungsanforderungen kann der Kopiervorgang jedoch zusätzlichen Aufwand verursachen. In diesem Fall können Sie erwägen, die Referenz direkt an das Slice-Feld zurückzugeben. Daher müssen Sie die Vor- und Nachteile basierend auf der jeweiligen Situation abwägen und die geeignete Methode zur Handhabung der Rückgabe privater Slice-Felder auswählen.

Frageninhalt

Wenn struct ein privates Slice-Feld hat, das einen Getter erfordert, sollte das Slice vor der Rückgabe kopiert werden?

Ich möchte bestätigen, ob es sicher ist, private Slices direkt vom Getter zurückzugeben, da ich nicht möchte, dass der Aufrufer sie über den Rückgabewert des Getters ändern kann.

Bei meinen bisherigen Tests scheint es, dass die zurückgegebenen Slices nicht mit den privaten Slice-Feldern verknüpft sind. Ich bin mir jedoch nicht sicher, ob dies in allen Szenarien funktioniert, und ich möchte copy nicht verwenden, wenn es nicht benötigt wird.

Das habe ich versucht:

package main

import "fmt"

type basket struct {
    fruits []string
}

func (b *basket) fruits() []string {
    return b.fruits
}

func (b *basket) addfruit(fruit string) {
    b.fruits = append(b.fruits, fruit)
}

func main() {
    basket := &basket{}
    basket.addfruit("apple")
    basket.addfruit("banana")
    basket.addfruit("orange")

    fruits := basket.fruits()
    fmt.println(fruits) // [apple banana orange]

    fruits = append(fruits, "mango")
    fruits = append(fruits, "lemon")
    fruits = append(fruits, "pineapple")
    fmt.println(fruits)          // [apple banana orange mango lemon pineapple]
    fmt.println(basket.fruits()) // [apple banana orange]
}
Nach dem Login kopieren

So sieht der Getter für copy aus:

func (b *Basket) Fruits() []string {
    result := make([]string, len(b.fruits))
    copy(result, b.fruits)
    return result
}
Nach dem Login kopieren

Workaround

Wie @kostix in den Kommentaren erwähnt hat, kommt es auf das Szenario an.

Für die im OP möchten wir copy verwenden, weil wir die Ausgabe des Getters vom privaten Feld trennen möchten, damit der Aufrufer sie nicht ändern kann.

Das obige ist der detaillierte Inhalt vonSollte ich eine Kopie für private Slice-Felder verwenden, bevor ich sie vom Getter zurückgebe?. 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!