Pointers Golang:打印内存地址的接口函数

Pointers Golang:打印内存地址的接口函数,pointers,memory,go,struct,interface,Pointers,Memory,Go,Struct,Interface,我很好奇,为什么仅仅在var上直接打印内存地址就可以了,而通过接口尝试执行相同的操作却不能打印出内存地址 package main import "fmt" type address struct { a int } type this interface { memory() } func (ad address) memory() { fmt.Println("a - ", ad) fmt.Println("a's memory address --&

我很好奇,为什么仅仅在var上直接打印内存地址就可以了,而通过接口尝试执行相同的操作却不能打印出内存地址

package main

import "fmt"

type address struct {
    a int
}

type this interface {
    memory()
}

func (ad address) memory() {
    fmt.Println("a - ", ad)
    fmt.Println("a's memory address --> ", &ad)
}

func main() {
    ad := 43
    fmt.Println("a - ", ad)
    fmt.Println("a's memory address --> ", &ad)

    //code init in here
    thisAddress := address{
        a: 42,
    }
    // not sure why this doesnt return memory address as well?
    var i this
    i = thisAddress
    i.memory()
}

只是想在修复错误后添加它,它现在可以正常工作了。 测试移位内存指针

package main

import "fmt"

type address struct {
  a int
}

type this interface {
  memory() *int
}

func (ad address) memory() *int {

  /*reflect.ValueOf(&ad).Pointer() research laws of reflection */
  var b = &ad.a

  return b
}

func main() {



  thisAddress := address{
      a: 42,
  }
  thatAddress := address{
      a: 43,
  }

  var i this
  i = thisAddress
  a := i.memory()

  fmt.Println("I am retruned", a)
  fmt.Println("I am retruned", *a)
  i = thatAddress
  c := i.memory()
  fmt.Println("I am retruned", c)
  fmt.Println("I am retruned", *c)
}

因为在第二种情况下,在
内存()方法中:

func (ad address) memory() {
    fmt.Println("a - ", ad)
    fmt.Println("a's memory address --> ", &ad)
}
ad
不是
int
而是一个结构,
ad
的类型是
address
。并且您打印的不是
int
的地址,而是
结构的地址。指向结构的指针的默认格式是:
&{}

从有关默认格式的文件包中引用:

如果修改该行以打印
地址的地址。类型为
int
字段:

fmt.Println("a's memory address --> ", &ad.a)
您将看到以十六进制格式打印的相同指针格式,例如:

a's memory address -->  0x1040e13c

在这种情况下,您应该使用
reflect
reflect.ValueOf(&ad).Pointer()
将以
uintpttr
的形式返回&ad(这是一个指针值)。谢谢你,刚刚查找了reflect,我正在阅读反射定律。我做了你建议的更改,它们的工作方式与我想要的完全一样。谢谢你的简洁回答。
a's memory address -->  0x1040e13c