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.
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] }
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 }
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!