Maison > développement back-end > Golang > Comment exposer les membres de tranche avec immuabilité ?

Comment exposer les membres de tranche avec immuabilité ?

PHPz
Libérer: 2024-02-09 09:20:11
avant
658 Les gens l'ont consulté

Comment exposer les membres de tranche avec immuabilité ?

Éditeur PHP Apple vous présentera comment exposer les membres de tranche avec immuabilité. En programmation, le découpage fait référence à l'opération d'interception d'une partie d'éléments ou de caractères d'un tableau ou d'une chaîne. Normalement, une opération de découpage renvoie un nouveau tableau ou une nouvelle chaîne, mais parfois nous souhaitons conserver le tableau ou la chaîne d'origine inchangé et exposer uniquement certains membres de la tranche. Cela peut améliorer les performances et l'utilisation de la mémoire de votre programme. Ensuite, nous détaillerons comment y parvenir.

Contenu de la question

J'ai une structure avec un membre de tranche et une méthode qui expose cette tranche. Mais je ne veux pas que l'appelant puisse modifier le contenu de la tranche. Si je le fais :

type a struct {
    slice []int
}

func (a *a) list() []int {
    return a.slice
}
Copier après la connexion

Ce n'est pas sécurisé car le contenu peut être facilement modifié :

a := a{[]int{1, 2, 3}}
_ = append(a.list()[:2], 4)
fmt.println(a.list()) // [1 2 4]
Copier après la connexion

Je peux évidemment faire en sorte que list() renvoie une copie de la tranche pour éviter cela :

func (a *A) list() []int {
    return append([]int{}, a.slice...)
}
Copier après la connexion
Mais cela signifie que je crée une copie à chaque fois que je veux simplement parcourir la tranche, ce qui semble inutile. Existe-t-il un moyen de procéder sans copie inutile ?

Solution de contournement

Une fois que vous avez fourni la tranche à un appelant externe en la renvoyant, vous pouvez la modifier. Si la copie n'est pas acceptée pour des raisons de performances, vous pouvez implémenter le visiteur :

func (a *a) visit(f func(int)) {
    for _, v := range a.slice {
        f(v)
    }
}
Copier après la connexion

Cela n'expose pas du tout la tranche et permet au code client d'afficher tous les éléments de la tranche en même temps. Si les éléments ne sont pas des pointeurs ou d'autres types mutables, ils sont effectivement en lecture seule car le rappel du visiteur recevra une copie de la valeur.

Si vous souhaitez arrêter l'itération plus tôt, le visiteur peut renvoyer une valeur booléenne (facultatif).

func (a *A) Visit(f func(int) bool) {
    for _, v := range a.slice {
        if !f(v) {
            return
        }
    }
}
Copier après la connexion

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!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal