栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

Go函数参数按值传递。

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

package mainimport "fmt"func byval(q *int) {    fmt.Printf("3. byval -- q %T: &q=%p q=&i=%p  *q=i=%vn", q, &q, q, *q)    *q = 4143    fmt.Printf("4. byval -- q %T: &q=%p q=&i=%p  *q=i=%vn", q, &q, q, *q)    q = nil}func main() {    i := int(42)    fmt.Printf("1. main  -- i  %T: &i=%p i=%vn", i, &i, i)    p := &i    fmt.Printf("2. main  -- p %T: &p=%p p=&i=%p  *p=i=%vn", p, &p, p, *p)    byval(p)    fmt.Printf("5. main  -- p %T: &p=%p p=&i=%p  *p=i=%vn", p, &p, p, *p)    fmt.Printf("6. main  -- i  %T: &i=%p i=%vn", i, &i, i)}

输出:

1. main  -- i  int: &i=0xf840000040 i=422. main  -- p *int: &p=0xf8400000f0 p=&i=0xf840000040  *p=i=423. byval -- q *int: &q=0xf8400000d8 q=&i=0xf840000040  *q=i=424. byval -- q *int: &q=0xf8400000d8 q=&i=0xf840000040  *q=i=41435. main  -- p *int: &p=0xf8400000f0 p=&i=0xf840000040  *p=i=41436. main  -- i  int: &i=0xf840000040 i=4143

在函数中

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

在函数中

main
p
是指向
int
内存位置(
&p
)处的变量的指针,该变量
0xf8000000f0
的值(
p
=
&i
0xf800000040
指向
int
值(
*p
=
i
42

在功能

main
byval(p)
是一个函数调用,其将值(
p
=
&i
0xf800000040
在存储器位置(自变量的
&p
0xf8000000f0
给函数
byval
参数
q
在存储器位置(
&q
0xf8000000d8
。换句话说,存储器被分配用于
byval
参数
q
和的值
main

byval
的参数
p
被分配给它; 的值
p
q
最初是相同的,但变量
p
q
是不同的。

在功能

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

在函数中

main
p
是指向
int
内存位置(
&p
)的变量的指针,该变量
0xf8000000f0
的值(
p
=
&i
0xf800000040
指向新
int
值(
*p
=
i
4143

在函数中

main
i
int
位于内存位置(
&i
)的变量,
0xf800000040
具有最终值(
i
4143

在您的示例中,用作函数调用参数的函数

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

在您的示例中,(

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

您应该接受mkb的明智建议,并停止使用

println(&s)
。使用
fmt
包装,例如,

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

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



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/568946.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号