Maison  >  Article  >  développement back-end  >  Dois-je utiliser la copie sur les champs de tranches privées avant de les renvoyer depuis le getter ?

Dois-je utiliser la copie sur les champs de tranches privées avant de les renvoyer depuis le getter ?

WBOY
WBOYavant
2024-02-09 16:30:10706parcourir

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

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.

Contenu de la question

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
}

Solution de contournement

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer