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

Comment exposer les membres de tranche avec immuabilité ?

PHPz
PHPzavant
2024-02-09 09:20:11659parcourir

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
}

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]

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...)
}
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)
    }
}

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
        }
    }
}

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