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
Mary-Kate Olsenoriginal
2024-12-03 15:55:121046parcourir

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
}

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!

Déclaration:
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