21s*_*1st 5 struct pointers reference pass-by-reference go
我有一个结构和方法正在处理结构参考.每次调用方法时指针地址都在变化.为什么会那样?
码
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()
}
Run Code Online (Sandbox Code Playgroud)
输出:
log.go:30: Whatever.GetNameByReference() memory address: 0xc420034020
log.go:30: Whatever.GetNameByReference() memory address: 0xc420034030
log.go:30: Whatever.GetNameByReference() memory address: 0xc420034038
Run Code Online (Sandbox Code Playgroud)
Vol*_*ker 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是指针,您对其值感兴趣,因此请打印此值.