"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Comment puis-je modifier une tranche passée comme argument de fonction dans Go ?

Comment puis-je modifier une tranche passée comme argument de fonction dans Go ?

Publié le 2024-12-20
Parcourir:450

How Can I Modify a Slice Passed as a Function Argument in Go?

Passer une tranche en tant qu'argument de fonction et modifier la tranche d'origine

Dans Go, la transmission d'arguments aux fonctions se fait par valeur, ce qui signifie que toute modification apportée à l'argument au sein de la fonction ne sont pas reflétés dans la variable d'origine. Cela peut devenir problématique lorsque vous travaillez avec des types de données mutables tels que des tranches, car l'ajout à la tranche dans la fonction n'affectera pas la tranche d'origine au-delà de la portée de la fonction.

Considérez l'exemple suivant :

nums := []int{1, 2, 3}

func addToNumbs(nums []int) []int {
    nums = append(nums, 4)
    fmt.Println(nums) // []int{1, 2, 3, 4}
}

fmt.Println(nums) // []int{1, 2, 3}

Dans cet exemple, la fonction AddToNumbs prend une copie de la tranche nums et ajoute la valeur 4. Cela modifie uniquement la copie dans la fonction, et la tranche numérique d'origine reste inchangée en dehors de la fonction.

Pour résoudre ce problème, vous devez transmettre la tranche par référence. Une façon de procéder consiste à passer un pointeur vers la tranche :

func myAppend(list *[]string, value string) {
    *list = append(*list, value)
}

En passant un pointeur sur la tranche, toutes les modifications apportées au sein de la fonction sont directement reflétées dans la tranche d'origine. Cependant, passer un pointeur signifie également que la fonction peut modifier la tranche d'une manière inattendue. Il est donc important d'utiliser les pointeurs avec précaution.

Une autre alternative consiste à renvoyer la tranche modifiée à partir de la fonction, comme démontré. dans l'exemple suivant :

func validate(obj Validatable, messages []ValidationMessage) []ValidationMessage {
    // Append to the accumulator and return it directly
    messages = append(messages, message)
    return messages
}

Dans ce cas, la fonction de validation renvoie la tranche de messages modifiée, éliminant ainsi le besoin de passer un pointeur vers la tranche.

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3