Maison > développement back-end > Golang > Comment la sémantique de passage par valeur de Go affecte-t-elle la manipulation du pointeur de structure ?

Comment la sémantique de passage par valeur de Go affecte-t-elle la manipulation du pointeur de structure ?

Mary-Kate Olsen
Libérer: 2024-12-03 15:55:12
original
1040 Les gens l'ont consulté

How Do Go's Pass-by-Value Semantics Affect Struct Pointer Manipulation?

Inspection des valeurs des pointeurs d'objet dans Go

Dans Go, les arguments de la fonction sont transmis par valeur, ce qui signifie que toute modification apportée aux arguments dans la fonction n'affecte pas l'original valeurs en dehors de la fonction. Cela peut prêter à confusion lorsqu'il s'agit de structures, car vous pouvez vous attendre à ce qu'elles soient transmises par référence.

Pour comprendre comment cela fonctionne, considérez l'extrait de code suivant :

package main

import (
    "fmt"
    "runtime"
)

type Something struct {
    number int
    queue  chan int
}

func gotest(s *Something, done chan bool) {
    fmt.Printf("from gotest:\n&s: %p\n", &s)
    for num := range s.queue {
        fmt.Println(num)
        s.number = num
    }
    done <- true
}

func main() {
    runtime.GOMAXPROCS(4)
    s := &Something{number: 42}
    fmt.Printf("&s: %p\n", &s)

    s.queue = make(chan int)
    done := make(chan bool)

    go gotest(s, done)
    s.queue <- 43

    close(s.queue)
    <-done

    fmt.Printf("&s: %p\n", &s)
    fmt.Println(s.number) // Output: 43
}
Copier après la connexion

Ce code démontre passer un pointeur de structure par valeur. Dans la fonction principale, nous créons une instance de Something et passons un pointeur vers celle-ci à la fonction gotest.

Dans la fonction gotest, nous modifions le champ numérique de la structure et transmettons également des messages à son canal de file d'attente. La fonction gotest opère sur une copie du pointeur, donc toute modification qu'elle apporte n'affectera pas la structure d'origine dans la fonction principale.

En utilisant l'expression &s, nous pouvons observer les valeurs du pointeur à différentes étapes d'exécution. Le résultat montre que :

  • Dans la fonction principale, avant d'appeler gotest, la valeur du pointeur de s est la même que la valeur du pointeur de l'expression &s, indiquant que s est bien un pointeur.
  • Dans la fonction gotest, la valeur du pointeur de &s est différente de la valeur du pointeur de s, confirmant que s est une copie du pointeur dans le fichier principal fonction.

Ce comportement est cohérent avec la sémantique de passage par valeur de Go, où les arguments sont copiés dans la portée de la fonction. Par conséquent, si vous souhaitez modifier la structure d'origine, vous devez lui passer un pointeur plutôt que la structure elle-même.

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