Sémantique des valeurs et des pointeurs dans Go
Go adhère au principe de la sémantique des valeurs, qui dicte que lorsque des valeurs sont transmises à des fonctions ou des méthodes , des copies de ces valeurs sont créées. Par conséquent, toute modification apportée aux copies au sein de la fonction n'a aucun impact sur les valeurs d'origine.
Ce comportement est évident dans l'exemple suivant :
func main() { i := 1 fmt.Println("double:", double(i)) fmt.Println("original i:", i) } func double(i int) int { i *= 2 return i }
Sortie :
double: 2 original i: 1
Comme illustré, la modification d'une valeur dans une fonction à l'aide de la sémantique des valeurs n'affecte pas la valeur d'origine.
En revanche, la sémantique des pointeurs permet aux appelés de modifier la valeur d'origine même si elle est transmise par valeur. Pour y parvenir, un pointeur vers la valeur d'origine doit être transmis.
func main() { i := 1 fmt.Println("double:", doublep(&i)) fmt.Println("original i:", i) } func doublep(i *int) int { *i *= 2 return *i }
Sortie :
double: 2 original i: 2
Les tranches dans Go présentent la sémantique du pointeur. Bien que les tranches soient transmises par valeur, elles contiennent un pointeur vers un tableau sous-jacent. Lorsqu'une tranche est transmise à une fonction, une copie de l'en-tête de la tranche est créée, mais elle conserve le même pointeur vers le tableau sous-jacent. En conséquence, les modifications apportées aux éléments de tranche au sein de la fonction sont reflétées dans la tranche d'origine.
func main() { is := []int{1, 2} fmt.Println("double:", doubles(is)) fmt.Println("original is:", is) } func doubles(is []int) []int { for i := range is { is[i] *= 2 } return is }
Sortie :
double: [2 4] original is: [2 4]
Ce mécanisme permet les modifications apportées aux éléments de tranche au sein d'une fonction à propager à la tranche d’origine. Les tableaux, cependant, adhèrent à la sémantique des valeurs, où le passage d'un tableau crée une copie de tous ses éléments.
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!