草庐IT

pointers - 戈朗 : interface func to print memory address

coder 2023-06-30 原文

我很好奇为什么直接在 var 上打印内存地址有效,但尝试通过接口(interface)执行相同的操作却无法打印出内存地址?

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 而是一个结构,adaddress 类型。您打印的不是 int 的地址,而是 struct 的地址。指向结构的指针的默认格式为:&{}

引用自 fmt 的包文档关于默认格式:

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

如果您修改该行以打印类型为 intaddress.a 字段的地址:

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

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

a's memory address -->  0x1040e13c

关于pointers - 戈朗 : interface func to print memory address,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39739743/

有关pointers - 戈朗 : interface func to print memory address的更多相关文章

  1. javascript - Chrome 开发工具 : Accessing the DOM element $0 pointer from bookmarklet/Snippet - 2

    是否可以从控制台中的书签或代码片段访问$0DOM元素指针?关于$0的更多信息https://developers.google.com/chrome-developer-tools/docs/commandline-api#0_-_4DevToolsremembersthelastfiveDOMelements(orJavaScriptheapobjects)thatyou'veselectedinthetab(orProfilespanel).Itmakesthoseobjectsavailableas$0,$1,$2,$3,and$4.$0returnsthemostrecentl

  2. javascript - css pointer-events 属性更改和各自的 jquery 事件不一起触发 - 2

    这是我的代码段。我正在使用iscroll4在触摸设备和桌面上滚动。$('#next_item').bind('mousedowntouchstart',function(e){//dosomethingonclick$(this).bind('mousemovetouchmove',function(e){//triggersonlywhenidragoveritdragstart=true;$(this).css('pointer-events','none');myScroll._start(myDown);return;});});$('#next_item').bind('mo

  3. pointers - 我如何比较 Go 中的指针? - 2

    我正在构建一些测试代码并尝试将指针与进行比较,>运营商。我的目标是将元素排序成一个平衡的树结构(由我实现)。为此,我需要快速、通用的比较。遵循良好的旧C/C++习惯,我目前的想法是(...在撰写本文时)通过指针地址比较它们。但是,正如我所发现的,它不起作用。来源if(&(a.val)给出编译错误./pointer.go:40:invalidoperation:&a.vala和b是val的结构作为(安全的)指针成员。是否可以在go中比较安全指针?怎么办?是否保证指针的顺序保持不变?(例如,我可以想象一些GC技巧也会对数据进行重新排序。) 最佳答案

  4. pointers - 当我将变量传递给 golang 中的私有(private)方法时,它会创建一个新实例吗? - 2

    如果我有主要功能:vara="foo"modify(a)fmt.Println(a)在哪里funcmodify(sstring)error{s="bar"}结果是"foo"还是"bar"? 最佳答案 没有。它不会编译,因为'foo'和'bar'都不是单个字符。但是假设您改用双引号。在Golang中,参数是按值传递的(它们被复制到内存中的新位置-堆栈或堆),无论是私有(private)方法还是公共(public)方法或任意函数都无关紧要。新实例已修改。您的示例的结果将是"foo"。为了修改位于函数外部的变量,您必须显式传递指向此类变量

  5. 戈朗 "Log in to the site and download the xls file"? - 2

    关闭。这个问题需要更多focused.它目前不接受答案。想改进这个问题吗?更新问题,使其只关注一个问题editingthispost.关闭3年前。Improvethisquestion告诉我如何使用Golang登录网站。下载xls文件是得到了,但是为了在Excel表格中有数据,需要登录网站。该站点位于公司的服务器上。如果你能告诉你怎么做。例如,我用来执行此操作的VBA代码。SetoFields=CreateObject("Scripting.Dictionary")WithoFields.Add"login","sdiscor".Add"password","sdiscor"EndWi

  6. pointers - 为什么解码到指针变量是不可能的? - 2

    我在包级别使用指针变量:varconfig*configuration但尝试解码到变量中会导致此错误:json:Unmarshal(nil*main.configuration)。但是,解码为指向指针变量的指针是成功的。这是什么原因? 最佳答案 Whyisunmarshalingintoapointervariablenotpossible?这是可能的。事实上,这是必需的。解码为非指针是不可能的。json:Unmarshal(nil*main.configuration)这个错误并不是说你不能解码到一个指针,而是说你不能解码到一个n

  7. arrays - 戈朗 : Could not understand how below code is executing - 2

    下面是我查询的代码:我有一个单维数组a当我打印a[0][0]时,我不明白为什么它返回字符a的ascii值:packagemainimport("fmt")funcmain(){a:=[3]string{"a","b","c"}fmt.Println(a[0][0])}输出:97 最佳答案 下面是如何打印ascii的代码示例a:=[3]string{"a","b","c"}for_,rune:=rangea{fmt.Println(rune)//Itwillprinta,b,c}因为你在你的代码中使用了[0][0],所以它是等价的fo

  8. pointers - 从非 chan 类型接收 *bool - 2

    我想守护我的应用程序,但我有一个大问题。我使用的channel是chanstruct{}类型。但是,对于包getopt(标志包),我的标志是*bool类型,所以我不知道如何修改我的应用程序。bool类型的channel还不够。我确定有一个我不明白的概念。我附上代码:packagemainimport("os""syscall""time""github.com/pborman/getopt/v2""github.com/sevlyar/go-daemon")var(done=make(chanstruct{})optQuit=make(chanstruct{})optRun=make(

  9. pointers - 如何在go中定义一个指针,然后将这个指针传递给一个func来改变它的值? - 2

    import"fmt"funczeroptr(ptr*int){*ptr=0}funcmain(){oneptr*int*ptr=1fmt.Println("ptris:",*ptr)zeroptr(ptr)fmt.Println("aftercallingzeroptr,thevalueofptris:",*ptr)}这不起作用,我正在寻找如下输出:ptr是:1调用zeroptr后,ptr的值为:0 最佳答案 您应该使用传递一个&int给zeroptr,如thisexample:packagemainimport"fmt"func

  10. go - 我可以在 Go 中使用 unsafe.Pointer 将 *interface{} 转换为 *int - 2

    我正在用Go创建一个内存池。我这样做是因为将int隐式转换为interface{}会触发内存分配。我想避免分配。我想在一个池中分配几种类型的指针。游泳池是这样的。typecreatorstruct{buf[]interface{}}func(cr*creator)Create()*interface{}{iflen(cr.buf)==0{cr.buf=make([]interface{},256)}current:=&cr.buf[0]cr.buf=cr.buf[1:]returncurrent}func(cr*creator)CreateInt()*int{pointer:=cr.C

随机推荐