我有一个结构和方法正在处理结构参考.每次调用方法时指针地址都在变化.为什么会那样?
码
package main import "k8s.io/contrib/compare/Godeps/_workspace/src/github.com/emicklei/go-restful/log" type Whatever struct{ Name string } func (whatever *Whatever) GetNameByReference() (string) { log.Printf("Whatever.GetNameByReference() memory address: %v", &whatever) return whatever.Name } func evaluateMemoryAddressWhenNotWritingAnything() { whatever := Whatever{} whatever.GetNameByReference() whatever.GetNameByReference() whatever.GetNameByReference() } func main() { evaluateMemoryAddressWhenNotWritingAnything() }
输出:
log.go:30: Whatever.GetNameByReference() memory address: 0xc420034020 log.go:30: Whatever.GetNameByReference() memory address: 0xc420034030 log.go:30: Whatever.GetNameByReference() memory address: 0xc420034038
Volker.. 11
永远不要思考,永远不要谈论参考.Go没有"参考"的概念,一切都是价值.有些东西是指针值.你的问题源于将其*X
视为"对X的引用"而不是:它是一个保存X
(或零)内存地址的值.
所以在func (whatever *Whatever)
变量中whatever
是指向a的指针Whatever
.值whatever
是Whatever
指针指向的内存地址.您想打印此内存地址,即值whatever
.
你呢Printf("%v", &whatever)
.记住:whatever
是一个变量(持有一个内存地址).&whatever
变量本身的地址也是如此:&whatever
属于类型**Whatever
.你找到的地址&whatever
是不是你感兴趣的值; 它只是用于存储原始地址的临时变量Whatever
.当然,这个临时变量没有固定在内存中,可能会自由变化.
你应该这样做Printf("%p", whatever)
.动词%p
用于指针值并且whatever
是指针,您对其值感兴趣,因此请打印此值.
永远不要思考,永远不要谈论参考.Go没有"参考"的概念,一切都是价值.有些东西是指针值.你的问题源于将其*X
视为"对X的引用"而不是:它是一个保存X
(或零)内存地址的值.
所以在func (whatever *Whatever)
变量中whatever
是指向a的指针Whatever
.值whatever
是Whatever
指针指向的内存地址.您想打印此内存地址,即值whatever
.
你呢Printf("%v", &whatever)
.记住:whatever
是一个变量(持有一个内存地址).&whatever
变量本身的地址也是如此:&whatever
属于类型**Whatever
.你找到的地址&whatever
是不是你感兴趣的值; 它只是用于存储原始地址的临时变量Whatever
.当然,这个临时变量没有固定在内存中,可能会自由变化.
你应该这样做Printf("%p", whatever)
.动词%p
用于指针值并且whatever
是指针,您对其值感兴趣,因此请打印此值.