当前位置:  开发笔记 > 编程语言 > 正文

Golang:为什么结构引用的内存地址会发生变化?

如何解决《Golang:为什么结构引用的内存地址会发生变化?》经验,为你挑选了1个好方法。

我有一个结构和方法正在处理结构参考.每次调用方法时指针地址都在变化.为什么会那样?

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.值whateverWhatever指针指向的内存地址.您想打印此内存地址,即值whatever.

你呢Printf("%v", &whatever).记住:whatever是一个变量(持有一个内存地址).&whatever变量本身的地址也是如此:&whatever属于类型**Whatever.你找到的地址&whatever不是你感兴趣的值; 它只是用于存储原始地址的临时变量Whatever.当然,这个临时变量没有固定在内存中,可能会自由变化.

你应该这样做Printf("%p", whatever).动词%p用于指针值并且whatever是指针,您对其值感兴趣,因此请打印此值.



1> Volker..:

永远不要思考,永远不要谈论参考.Go没有"参考"的概念,一切都是价值.有些东西是指针值.你的问题源于将其*X视为"对X的引用"而不是:它是一个保存X(或零)内存地址的值.

所以在func (whatever *Whatever)变量中whatever是指向a的指针Whatever.值whateverWhatever指针指向的内存地址.您想打印此内存地址,即值whatever.

你呢Printf("%v", &whatever).记住:whatever是一个变量(持有一个内存地址).&whatever变量本身的地址也是如此:&whatever属于类型**Whatever.你找到的地址&whatever不是你感兴趣的值; 它只是用于存储原始地址的临时变量Whatever.当然,这个临时变量没有固定在内存中,可能会自由变化.

你应该这样做Printf("%p", whatever).动词%p用于指针值并且whatever是指针,您对其值感兴趣,因此请打印此值.


顺便说一下:你应该想出更好的名字.区分"无论什么"和"无所不能"基本上是不可能的.
在Go中它将是`func(w*Whatever)`.
推荐阅读
携手相约幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有