Maison >développement back-end >Golang >Comment puis-je afficher et suivre la valeur du pointeur d'un objet Go tout au long de sa durée de vie ?
Comment puis-je afficher la valeur du pointeur d'un objet Go ? Démêler la signification des valeurs de pointeur
Dans Go, comprendre si les structures sont transmises par valeur ou par référence est crucial. Cet article plonge dans ce concept et explore une technique pour imprimer la valeur du pointeur d'un objet dans Go.
Comprendre la valeur par rapport au passage de référence
Les fonctions Go transmettent les arguments par valeur, ce qui signifie que la fonction reçoit une copie de l'objet original. Cela implique que toute modification apportée à l'argument dans la fonction n'affecte pas l'objet d'origine. À l'inverse, si les structures sont passées par référence, toutes les modifications apportées au sein de la fonction sont reflétées dans l'objet d'origine.
Révéler les valeurs du pointeur dans Go
Pour déterminer si une structure est passée par valeur ou par référence, il est utile d'inspecter la valeur de son pointeur. Dans Go, l'opérateur & renvoie un pointeur vers la variable, qui peut être imprimé à l'aide du spécificateur de format %p. Cependant, cette valeur de pointeur peut changer lors du garbage collection.
Pour obtenir un ID d'objet persistant, il est recommandé d'utiliser la fonction runtime.SetFinalizer(). Cela implique de fournir un finaliseur, qui est appelé juste avant que le garbage collector ne supprime l'objet. En créant une carte d'unicité dans le finaliseur, vous pouvez attribuer un identifiant unique à chaque objet pour l'identifier tout au long de sa durée de vie.
Extension de l'exemple
Considérez le Go suivant code :
package main import ( "fmt" "runtime" ) type Something struct { number int queue chan int } func gotest(s *Something, done chan bool) { fmt.Println("from gotest:") fmt.Println(&s) for num := range s.queue { fmt.Println(num) s.number = num } done <- true } func main() { runtime.GOMAXPROCS(4) s := new(Something) fmt.Println(&s) s.queue = make(chan int) done := make(chan bool) go gotest(s, done) s.queue <- 42 close(s.queue) <-done fmt.Println(&s) fmt.Println(s.number) }
L'exécution de ce code afficherait :
0x4930d4 from gotest: 0x4974d8 42 0x4930d4 42
Cela démontre que le la valeur du pointeur dans la routine go est différente de l'objet d'origine, mais la valeur du champ numérique est mise à jour correctement.
Conclusion
Pendant que les fonctions Go transmettent les arguments par valeur , vous pouvez toujours inspecter les valeurs du pointeur pour comprendre le comportement de votre code. En utilisant des techniques telles que la définition de finaliseurs, vous pouvez obtenir un aperçu de l'identité et du comportement de référence de l'objet, ce qui peut être particulièrement utile dans les scénarios de programmation simultanée.
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!