Maison > développement back-end > Golang > Comment la sémantique des valeurs et des pointeurs affecte-t-elle la modification des variables dans Go ?

Comment la sémantique des valeurs et des pointeurs affecte-t-elle la modification des variables dans Go ?

Linda Hamilton
Libérer: 2024-12-16 17:52:12
original
992 Les gens l'ont consulté

How Do Value and Pointer Semantics Affect Variable Modification in Go?

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
}
Copier après la connexion

Sortie :

double: 2
original i: 1
Copier après la connexion

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
}
Copier après la connexion

Sortie :

double: 2
original i: 2
Copier après la connexion

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
}
Copier après la connexion

Sortie :

double: [2 4]
original is: [2 4]
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal