首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么结构引用的内存地址会改变?

为什么结构引用的内存地址会改变?
EN

Stack Overflow用户
提问于 2017-01-18 08:41:03
回答 3查看 3.5K关注 0票数 5

我有一个结构和一个方法来处理结构引用。每次调用该方法时,指针地址都会发生变化。为什么是那样的?

代码

代码语言:javascript
复制
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()
}

输出:

代码语言:javascript
复制
log.go:30: Whatever.GetNameByReference() memory address: 0xc420034020
log.go:30: Whatever.GetNameByReference() memory address: 0xc420034030
log.go:30: Whatever.GetNameByReference() memory address: 0xc420034038
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-01-18 08:55:51

不要思考,也不要谈论推荐信。Go没有“参考”的概念,一切都是一种价值。有些东西是指针值。您的问题源于将*X视为“对X的引用”,但它不是:它是一个保存X (或零)内存地址的值。

因此,在func (whatever *Whatever)中,变量whatever是指向Whatever的指针。whatever的值是指针指向的Whatever的内存地址。您希望打印这个内存地址,即whatever的值。

你做Printf("%v", &whatever)。记住:whatever是一个变量(包含一个内存地址)。所以&whatever是变量本身的地址:&whatever**Whatever类型的。您在address &whatever中找到的不是您感兴趣的值;它只是用来存储原始Whatever地址的临时变量。当然,这个临时变量不会固定在内存中,可能会自由变化。

你应该做Printf("%p", whatever)。动词%p是指针值,whatever是指针,您对它的值感兴趣,所以打印这个值。

票数 11
EN

Stack Overflow用户

发布于 2017-01-18 08:52:54

您不是显示结构的地址,而是显示地址的地址(指针的地址)。指针作为参数传递,因此每次都是新的。删除& in log.Printf("Whatever.GetNameByReference() memory address: %v", &whatever)以获得所需的内容(使用%p而不是%v)。

票数 3
EN

Stack Overflow用户

发布于 2017-01-18 09:33:17

调用方法

代码语言:javascript
复制
func (whatever *Whatever) GetNameByReference() (string) {

与调用函数(提供接收方作为第一个参数)非常相似。

代码语言:javascript
复制
func GetNameByReference(whatever *Whatever) (string) {

Go调用约定总是传递参数copy_by_value。因此,每次调用whatever.GetNameByReference()时,它都会收到whatever的新副本,该副本本身包含相同的*Whatever地址。已经写好了

代码语言:javascript
复制
log.Printf("Whatever.GetNameByReference() memory address: %v", whatever) //instead of &whatever

将记录相同的whatever值,即地址。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41714727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档