当前位置: 首页 > 面试题库 >

Golang:界面函数来打印内存地址

卫烨
2023-03-14
问题内容

我很好奇为什么只在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()
}

https://play.golang.org/p/Ko8sEVfehv

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

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)
}

https://play.golang.org/p/BnB14-yX8B


问题答案:

因为在memory()方法第二种情况下:

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

ad不是一个int而是一个结构,ad是类型的address。而且您不是在打印的地址,int而是在打印的地址struct。指向结构体的指针的默认格式为:&{}

从软件包文档中引用fmt有关默认格式的信息:

struct:             {field0 field1 ...}
array, slice:       [elem0 elem1 ...]
maps:               map[key1:value1 key2:value2]
pointer to above:   &{}, &[], &map[]

如果您修改该行以打印以下address.a类型的字段的地址int

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

您将看到以十六进制格式打印的相同指针格式,例如:

a's memory address -->  0x1040e13c


 类似资料:
  • 问题内容: 我有一些C方面的经验,对golang完全陌生。 现在在golang slice中是array的引用,其中包含指向slice的数组len和slice的上限的指针,但是该slice也将分配在内存中,我想打印该内存的地址。但是无法做到这一点。 问题答案: http://golang.org/pkg/fmt/ 将打印地址。

  • 问题内容: 为什么地图打印混乱,如何使它秩序井然? 打印输出: 问题答案: 码: (其中大部分是从萨默菲尔德先生的书中偷走的) 输出:

  • 问题内容: 无论如何,是否可以使用新的Swift语言从Objective-C 模拟? 例如: 问题答案: 现在,它已成为标准库的一部分:。 迅捷3 对于Swift 3,请使用:

  • #include <stdio.h> int main(void) { int i = 0; char a[100]; for (i = 0; i < sizeof(a); i++) { a[i] = i; } return 0; } 技巧 gdb中使用“x”命令

  • 问题内容: 我正在尝试打印地图的类型,例如:map [int] string 所以如果我这样做: 我想得到 但我找不到正确的电话。 问题答案: 尽量不要使用。但是,如果您必须使用: 甲值具有函数,该函数返回一个值。 如果该类型为,则这是某些类型T1和T2 的type值,其中T1是键类型,T2是元素类型。 因此,在使用时,我们可以像这样将片段分开: 在Go Playground上查看更完整的示例 。

  • 问题内容: 我有以下练习: 如果是工作日,则参数weekday为True,如果我们在假期,则参数Vacation为True。如果不是工作日,或者我们正在休假,我们会入睡。如果我们入睡,则返回True。 这是我所做的,但是第二个打印功能仅打印。 输出: 问题答案: 除非明确指示否则python中的函数会返回。 在上面的函数中,您没有考虑工作日为的情况。解释器到达函数的末尾而没有读取return语句(