Passez efficacement les tranches dans Go : évitez les limitations de transmission de valeurs
Dans Go, passer une tranche en tant qu'argument de fonction se fait essentiellement par valeur. Cela implique que si une tranche d'argument est modifiée dans la fonction à l'aide de append, cela n'affectera pas la tranche d'origine en dehors de la portée de la fonction.
Pour illustrer cette limitation, considérons 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, les numéros de tranche d'origine restent inchangés malgré la modification dans la fonction addToNumbs. Pour résoudre ce problème, on peut plutôt passer un pointeur vers la tranche :
func myAppend(list *[]string, value string) { *list = append(*list, value) }
Cette approche garantit que la tranche d'origine est modifiée directement.
Alternativement, dans certains scénarios, renvoyer simplement le la tranche modifiée de la fonction peut être une solution efficace :
func validate(obj Validatable, messages []ValidationMessage) ([]ValidationMessage, error) { // Modification... return messages, nil }
En résumé, lors du passage d'une tranche comme argument dans Go, il est crucial de considérer si les modifications dans la fonction doit avoir un impact sur la tranche d'origine. Si tel est le cas, utiliser un pointeur sur la tranche ou renvoyer la tranche modifiée sont des approches efficaces pour obtenir le comportement souhaité.
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!