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

Golang指针之间的区别

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

Golang指针之间的区别

TL; DR:
在第一种情况下,您传递了

*Test
用于打印的type值,但在第二种情况下,您传递了type的值
*interface{}
!该
%v
动词表示使用默认格式进行格式化,但是默认格式取决于值的类型。


您看到的区别只是

fmt
包实现的默认格式设置规则。

您正在使用

fmt.Printf()

func Printf(format string, a ...interface{}) (n int, err error)

它以格式字符串和其他参数作为类型

interface{}
。因此请注意,如果您传递的值不是type
interface{}
,则该值将被包装为type值
interface{}

现在,让我们看看您的示例:

test1 := Test{}// ...fmt.Printf("%v", &test1)

test1
是类型的
Test
,而您通过的
&test1
是类型
*Test
。这将包装在
interface{}
。来自的打包文档的格式规则
fmt

对于复合对象,将使用以下规则递归地打印元素,其布局如下:

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

由于它是指向的指针

struct
,因此
&{}
将使用该格式。
Test
有一个字段
Teststring
,但是您没有设置它的值,因此它默认为空字符串类型的零值。这就是为什么在显示时什么也看不到的原因。请注意,如果您要像这样初始化它:
string``""

test1 := Test{"a"}

输出为:

&{a}

让我们来看第二个例子:

test2 := Models["test"]// ...fmt.Printf("%v", &test2)

第一行是一个简短的变量声明,类型

test2
将从右侧表达式中推断出来。右侧表达式是一个索引表达式,为地图建立索引。其类型将是映射的值类型,并且由于类型为
Models
is
map[string]interface{}
,所以类型of
test2
将为
interface{}

到目前为止,一切都很好。但是,当您尝试像这样打印时会发生什么

fmt.Printf("%v",&test2)
?您传递的指针
test2
类型是
interface{}
,所以传递的类型是
*interface{}
,并且由于与并不相同
interface{}
,它将被包装在另一个
interface{}
值中。

因此,传递给它的

fmt.Printf()
是一个
interface{}
值,将
*interface{}
值包装为
test2
变量的地址。

现在,此处适用的格式设置规则:

%v的默认格式为:

bool:         %tint, int8 etc.:          %duint, uint8 etc.:        %d, %x if printed with %#vfloat32, complex64, etc: %gstring:       %schan:         %ppointer:      %p

由于要格式化的值是指针(

*interface{}
),
%v
因此默认为
%p
,即:

指针:

%p    base 16 notation, with leading 0x

因此,结果是正确以十六进制格式打印地址值,例如:

0x1040a160

要从中获取结构

test2
,可以使用类型断言。因此它应该是这样的:

t2 := Models["test"]test2 := t2.(Test) // test2 is of type Test

test2
类型与的类型相同
test1
,并且在打印时将产生相同的结果。在Go
Playground上尝试一下。

最好是将

*Test
值存储在映射中,因此不需要类型声明,甚至不需要存储在局部变量中,因为
interface{}
映射中存储的对象已经是的指针
Test
,可以按原样使用/传递它。



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

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

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