我有一个结构和在结构参考上工作的方法。每次我调用该方法时,指针地址都会改变。为什么会这样呢?
码
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
永远不要思考,永远不要谈论引用。Go没有“引用”的概念,一切都是价值。有些东西是指针值。您的问题源于将其*X
视为不是“对X的引用”:它是一个保存X
(或nil)的内存地址的值。
因此,func (whatever *Whatever)
在变量中whatever
是指向的指针Whatever
。的值whatever
是Whatever
指针指向的内存地址。您想打印该内存地址,即的值whatever
。
你做Printf("%v", &whatever)
。记住:whatever
是一个变量(保存一个内存地址)。&whatever
变量本身的地址也是如此:&whatever
是type **Whatever
。你找到的地址&whatever
是不是你感兴趣的值; 它只是用于存储原始地址的临时变量Whatever
。当然,此临时变量不会固定在内存中,并且可以自由更改。
你应该做Printf("%p", whatever)
。该动词%p
用于指针值,并且whatever
是一个指针,您对其值感兴趣,因此请打印此值。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句