Maison > développement back-end > Golang > Quelle est la différence entre la sémantique des valeurs et celle des pointeurs dans Go ?

Quelle est la différence entre la sémantique des valeurs et celle des pointeurs dans Go ?

DDD
Libérer: 2024-12-22 09:31:34
original
262 Les gens l'ont consulté

What's the Difference Between Value and Pointer Semantics in Go?

Comprendre la sémantique des valeurs et des pointeurs dans Go

Dans Go, lors du passage de valeurs à des fonctions ou des méthodes, nous rencontrons souvent les concepts de valeur et sémantique du pointeur. Ces concepts jouent un rôle crucial dans la compréhension de la manière dont les données sont traitées et modifiées au sein des programmes.

Sémantique des valeurs

La sémantique des valeurs implique que lorsque nous transmettons la valeur d'une variable comme un argument à une fonction, une copie de cette valeur est créée et transmise. La fonction ne peut opérer et modifier que la copie, pas la variable d'origine.

func double(i int) int {
    i *= 2
    return i
}

func main() {
    i := 1
    fmt.Println("Original i:", i)  // 1
    fmt.Println("Doubled i:", double(i))  // 2
    fmt.Println("Updated i:", i)  // 1
}
Copier après la connexion

Dans cet exemple, la valeur de i est copiée dans la fonction double et la fonction modifie la copie. La valeur originale de i reste inchangée.

Sémantique du pointeur

Contrairement à la sémantique des valeurs, la sémantique du pointeur signifie que lorsque nous passons un pointeur vers une variable comme argument à une fonction, la fonction peut modifier directement la variable d'origine.

func doublePointer(ptr *int) {
    *ptr *= 2
}

func main() {
    i := 1
    fmt.Println("Original i:", i)  // 1
    fmt.Println("Doubled i:", doublePointer(&i))  // 2
    fmt.Println("Updated i:", i)  // 2
}
Copier après la connexion

Ici, on passe l'adresse de i au doublePointer fonction à l’aide d’un pointeur (*). La fonction peut alors modifier la valeur à l'adresse et la variable d'origine i est mise à jour.

Slices : un cas de sémantique des pointeurs

Un aspect intéressant de Go est que même si les tranches sont transmises par valeur, elles présentent une sémantique de pointeur. Cela signifie que si nous passons une tranche à une fonction, la fonction peut modifier les éléments du tableau sous-jacent, qui sont également référencés par la tranche d'origine.

func doubleSlice(s []int) {
    for i := range s {
        s[i] *= 2
    }
}

func main() {
    is := []int{1, 2}
    fmt.Println("Original slice:", is)  // [1, 2]
    fmt.Println("Doubled slice:", doubleSlice(is))  // [2, 4]
    fmt.Println("Updated slice:", is)  // [2, 4]
}
Copier après la connexion

Dans cet exemple, même si nous passons est en tant que valeur, la fonction doubleSlice peut modifier ses éléments car les tranches stockent une référence à leur tableau sous-jacent. Par conséquent, les éléments de la tranche d'origine sont également mis à jour.

Comprendre la sémantique des valeurs et des pointeurs est crucial pour une programmation efficace dans Go. Il permet aux développeurs de contrôler la manière dont les données sont modifiées et partagées au sein et entre les fonctions.

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal