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