您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

如何打印Go对象的指针值?指针值是什么意思?

如何打印Go对象的指针值?指针值是什么意思?

Go函数参数按值传递。

首先,让我们丢弃示例中不相关的部分,以便我们可以轻松地看到您只是按值传递参数。例如,

package main

import "fmt"

func byval(q *int) {
    fmt.Printf("3. byval -- q %T: &q=%p q=&i=%p  *q=i=%v\n", q, &q, q, *q)
    *q = 4143
    fmt.Printf("4. byval -- q %T: &q=%p q=&i=%p  *q=i=%v\n", q, &q, q, *q)
    q = nil
}

func main() {
    i := int(42)
    fmt.Printf("1. main  -- i  %T: &i=%p i=%v\n", i, &i, i)
    p := &i
    fmt.Printf("2. main  -- p %T: &p=%p p=&i=%p  *p=i=%v\n", p, &p, p, *p)
    byval(p)
    fmt.Printf("5. main  -- p %T: &p=%p p=&i=%p  *p=i=%v\n", p, &p, p, *p)
    fmt.Printf("6. main  -- i  %T: &i=%p i=%v\n", i, &i, i)
}

输出

1. main  -- i  int: &i=0xf840000040 i=42
2. main  -- p *int: &p=0xf8400000f0 p=&i=0xf840000040  *p=i=42
3. byval -- q *int: &q=0xf8400000d8 q=&i=0xf840000040  *q=i=42
4. byval -- q *int: &q=0xf8400000d8 q=&i=0xf840000040  *q=i=4143
5. main  -- p *int: &p=0xf8400000f0 p=&i=0xf840000040  *p=i=4143
6. main  -- i  int: &i=0xf840000040 i=4143

函数mainiint位于内存位置(&i)的0xf800000040具有初始值(i)的变量42

函数mainp是指向int内存位置(&p)处的变量的指针,该变量0xf8000000f0的值(p=&i0xf800000040指向int值(*p= i42

功能mainbyval(p)一个函数调用,其将值(p=&i0xf800000040在存储器位置(自变量的&p0xf8000000f0函数byval参数q在存储器位置(&q0xf8000000d8。换句话说,存储器被分配用于byval参数q和的值mainbyval的参数p被分配给它; 的值pq最初是相同的,但变量pq是不同的。

功能byval,使用指针q*int),它是指针的一个拷贝p*int),整数*qi)被设置为一个新的int值4143。最后返回之前。指针q设置为nil(零值),p由于q是副本,因此不起作用。

函数mainp是指向int内存位置(&p)的变量的指针,该变量0xf8000000f0的值(p=&i0xf800000040指向新int值(*p= i4143

函数mainiint位于内存位置(&i)的变量,0xf800000040具有最终值(i4143

在您的示例中,用作函数调用参数的函数main变量与function 参数不同。它们具有相同的名称,但是是具有不同作用域和存储位置的不同变量。函数参数隐藏函数调用参数。这就是为什么在我的例子,我命名的参数和参数变量,并分别以强调差异。s``gotest``gotest``s``s``s``p``q

在您的示例中,(&s0x4930d4s函数main中变量的存储位置的地址,用作函数调用的参数gotest(s, done),并且0x4974d8函数gotest参数的存储位置的地址s。如果s = nil函数末尾设置参数gotest,则它对sin中的变量没有影响mainsin mainsingotest是不同的内存位置。就类型而言,&sis **Somethingsis *Something*sisSomething&s是指向(存储位置的地址)s的指针,它是指向(存储位置的地址)类型的匿名变量的指针Something。在价值观方面,main.&s != gotest.&smain.s == gotest.smain.*s == gotest.*s,和main.s.number == gotest.s.number

您应该接受mkb的明智建议,并停止使用println(&s)。使用fmt包装,例如,

fmt.Printf("%v %p %v\n", &s, s, *s)

当指针指向相同的存储位置时,它们具有相同的值。指针指向不同的内存位置时,它们具有不同的值。

Go 2022/1/1 18:15:21 有453人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶