En programmation orientée objet, la méthode getter est généralement utilisée pour obtenir la valeur d'une variable membre privée. Cependant, une question se pose parfois : dois-je utiliser la copie des champs de tranches privées avant de les renvoyer à partir de la méthode getter ? La réponse à cette question n’est pas absolue et dépend des circonstances spécifiques. Dans certains cas, la copie d'un champ de tranche privée peut empêcher le code externe de modifier le champ, protégeant ainsi la cohérence et la sécurité des données. Cependant, dans certains scénarios exigeant des performances élevées, l'opération de copie peut entraîner une surcharge supplémentaire. Dans ce cas, vous pouvez envisager de renvoyer directement la référence au champ slice. Par conséquent, vous devez peser le pour et le contre en fonction de la situation spécifique et choisir la manière appropriée de gérer le retour des champs de tranches privées.
Si struct
avez un champ de tranche privé qui nécessite un getter, la tranche doit-elle être copiée avant de la renvoyer ?
Je souhaite confirmer s'il est sûr de renvoyer des tranches privées directement depuis le getter, car je ne veux pas que l'appelant puisse les modifier via la valeur de retour du getter.
D'après mes tests jusqu'à présent, il semble que les tranches renvoyées ne soient pas liées aux champs de tranches privées.
Cependant, je ne suis pas sûr que cela fonctionne dans tous les scénarios, et je ne veux pas utiliser copy
si ce n'est pas nécessaire.
Voici ce que j'ai essayé :
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] }
Voici à quoi ressemble le getter pour copy
:
func (b *Basket) Fruits() []string { result := make([]string, len(b.fruits)) copy(result, b.fruits) return result }
Comme @kostix l'a mentionné dans les commentaires, cela dépend du scénario.
Pour celui de l'OP, nous voulons utiliser copy
parce que nous voulons séparer la sortie du getter du champ privé afin que l'appelant ne puisse pas la modifier.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!