Comment puis-je imprimer la valeur du pointeur d'un objet? Quelle est la valeur du pointeur veux dire?
Je suis en train de jouer au rendez-vous et n'ont pas encore un bon modèle mental de lorsque les structures sont passés par valeur ou par référence.
C'est peut-être une question stupide mais je veux juste s'amuser un peu et voir si je suis encore à travailler sur le même objet ou j'ai fait une copie de celui-ci (passé par valeur).
Est-il un moyen d'imprimer le pointeur (ou id interne si la valeur du pointeur est modifié par gc) d'un objet?
package main
import ( "runtime" )
type Something struct {
number int
queue chan int
}
func gotest( s *Something, done chan bool ) {
println( "from gotest:")
println( &s )
for num := range s.queue {
println( num )
s.number = num
}
done <- true
}
func main() {
runtime.GOMAXPROCS(4)
s := new(Something)
println(&s)
s.queue = make(chan int)
done := make(chan bool)
go gotest(s, done)
s.queue <- 42
close(s.queue)
<- done
println(&s)
println(s.number)
}
donne sur mon windows (8g version compilée):
0x4930d4
from gotest:
0x4974d8
42
0x4930d4
42
Pourquoi le pointeur de la valeur à partir de l'intérieur de l'aller routine afficher une valeur différente? La quantité sur l'objet d'origine ne sont modifiées de sorte qu'il a été de travailler avec le même objet. Est-il possible de voir un id de l'objet qui est persistant?
Vous devez vous connecter pour publier un commentaire.
Aller les arguments d'une fonction sont passés par valeur.
Tout d'abord, nous allons jeter la pertinence des parties de votre exemple, de sorte que nous pouvons facilement voir que vous êtes simplement de passage d'argument par valeur. Par exemple,
De sortie:
En fonction
main
,i
est unint
variable à l'emplacement de la mémoire (&i
)0xf800000040
avec une valeur initiale (i
)42
.En fonction
main
,p
est un pointeur vers uneint
variable à l'emplacement de la mémoire (&p
)0xf8000000f0
avec une valeur (p
=&i
)0xf800000040
qui renvoie à uneint
valeur (*p
=i
)42
.En fonction
main
,byval(p)
est un appel de fonction qui attribue la valeur (p
=&i
)0xf800000040
de l'argument à l'emplacement de la mémoire (&p
)0xf8000000f0
à la fonctionbyval
paramètreq
à l'emplacement de la mémoire (&q
)0xf8000000d8
. En d'autres termes, la mémoire est allouée pour labyval
paramètreq
et la valeur de lamain
byval
argumentp
est assignée; les valeurs dep
etq
sont les mêmes au départ, mais les variablesp
etq
sont distincts.En fonction
byval
, à l'aide du pointeur de laq
(*int
), qui est une copie du pointeurp
(*int
), entier*q
(i
) est mis à une nouvelle valeur int4143
. À la fin avant de la retourner. le pointeurq
est fixé ànil
(valeur zéro), qui n'a aucun effet surp
depuisq
est une copie.En fonction
main
,p
est un pointeur vers uneint
variable à l'emplacement de la mémoire (&p
)0xf8000000f0
avec une valeur (p
=&i
)0xf800000040
qui pointe vers une nouvelleint
valeur (*p
=i
)4143
.En fonction
main
,i
est unint
variable à l'emplacement de la mémoire (&i
)0xf800000040
avec une valeur finale (i
)4143
.Dans votre exemple, la fonction
main
variables
utilisé comme un argument de la fonctiongotest
appel n'est pas la même que la fonctiongotest
paramètres
. Ils ont le même nom, mais sont différentes variables avec des portées différentes et des emplacements de mémoire. Le paramètre de la fonctions
cache l'appel de la fonction arguments
. C'est pourquoi, dans mon exemple, j'ai nommé les arguments et les variables de paramètrep
etq
respectivement de souligner la différence.Dans votre exemple, (
&s
)0x4930d4
est l'adresse de l'emplacement mémoire pour la variables
en fonctionmain
qui est utilisé comme un argument à l'appel de la fonctiongotest(s, done)
, et0x4974d8
est l'adresse de l'emplacement mémoire pour la fonctiongotest
paramètres
. Si vous définissez le paramètres = nil
à la fin de la fonctiongotest
, il n'a pas d'effet sur la variables
dansmain
;s
dansmain
ets
dansgotest
sont distincts des emplacements de mémoire. En termes de types,&s
est**Something
,s
est*Something
, et*s
estSomething
.&s
est un pointeur (l'adresse de l'emplacement mémoire)s
, qui est un pointeur (l'adresse de l'emplacement mémoire) anonyme variable de typeSomething
. En termes de valeurs,main.&s != gotest.&s
,main.s == gotest.s
,main.*s == gotest.*s
, etmain.s.number == gotest.s.number
.Vous devriez prendre mkb sages conseils et de cesser d'utiliser
println(&s)
. Utiliser lefmt
paquet, par exemple,Les pointeurs ont la même valeur lorsqu'ils pointent vers le même emplacement de mémoire; les pointeurs ont des valeurs différentes quand ils pointent vers différents emplacements de mémoire.
s
pointeur), - les pointeurs sont passés par valeur, l'adresse des
n'est pas le même ques
. Si votre gotest fonction neprintln( s )
intead, il avait l'impression qu'il la valeur du pointeur.En Aller, les arguments sont passés par valeur.
De sortie:
func f(s *SomeStruct) {
De SORTIE:
résultats dans:
Selon Wikipédia: