Pointers 指向结构或数组值的指针如何工作?
考虑到以下Go结构:Pointers 指向结构或数组值的指针如何工作?,pointers,go,struct,reference,Pointers,Go,Struct,Reference,考虑到以下Go结构: type Person struct { Name string Age int Country string } 我在以下使用中遇到过无数次: p := &Person{"Adam", 33, "Argentina"} 然而,我看不到指向结构值的意义,我想知道,它与: n := &999 // Error 我的问题是: 即使它是一个结构或数组而不是字符串或int之类的基元,怎么可能指向一个值呢?奇怪的是,以下内容
type Person struct {
Name string
Age int
Country string
}
我在以下使用中遇到过无数次:
p := &Person{"Adam", 33, "Argentina"}
然而,我看不到指向结构值的意义,我想知道,它与:
n := &999 // Error
我的问题是:
fmt.Println(p, &p) // outputs: &{Adam 33 Argentina} 0xc042084018
&Person{}
是一种语言“构造”,它是规范的一部分:它分配一个Person
类型的新变量,并提供该匿名变量的地址
复合文字的值生成指向用文字值初始化的唯一值的指针
此外:
调用内置函数或获取变量的地址会在运行时为变量分配存储
语言规范不允许使用&999
。地址运算符的可能操作数列在
操作数必须是可寻址的,即变量、指针间接寻址或切片索引操作;或可寻址结构操作数的字段选择器;或可寻址数组的数组索引操作。作为可寻址性要求的例外,x
也可以是a(可能带括号)
p:=Person{}
创建一个新变量p
,其类型将为Person
p:=&Person{}
创建一个类型为*Person
的新变量
请参阅可能的副本:
当您使用软件包打印值时,软件包具有某些规则,即如何打印不同类型的值:
对于复合对象,元素使用以下规则以递归方式打印,布局如下:
struct: {field0 field1 ...}
array, slice: [elem0 elem1 ...]
maps: map[key1:value1 key2:value2]
pointer to above: &{}, &[], &map[]
当您使用fmt.Println()
时,将应用默认的格式规则,对于*int
类型的值,它是%p
动词,它将以十六进制格式打印内存地址,但对于指向struct的指针,它将打印带有&
符号(&{}
)的结构值。您可以在相关问题中了解更多信息:
如果要打印指向的值,请取消对指针的引用并传递指向的值,例如:
var p = new(int)
*p = 12
fmt.Println(*p) // Prints 12
关于为什么要创建指向值(而不是值)的指针,请参见以下相关问题:
&Person{}
是一种语言“构造”,它是规范的一部分:它分配一个Person
类型的新变量,并提供该匿名变量的地址
复合文字的值生成指向用文字值初始化的唯一值的指针
此外:
调用内置函数或获取变量的地址会在运行时为变量分配存储
语言规范不允许使用&999
。地址运算符的可能操作数列在
操作数必须是可寻址的,即变量、指针间接寻址或切片索引操作;或可寻址结构操作数的字段选择器;或可寻址数组的数组索引操作。作为可寻址性要求的例外,x
也可以是a(可能带括号)
p:=Person{}
创建一个新变量p
,其类型将为Person
p:=&Person{}
创建一个类型为*Person
的新变量
请参阅可能的副本:
当您使用软件包打印值时,软件包具有某些规则,即如何打印不同类型的值:
对于复合对象,元素使用以下规则以递归方式打印,布局如下:
struct: {field0 field1 ...}
array, slice: [elem0 elem1 ...]
maps: map[key1:value1 key2:value2]
pointer to above: &{}, &[], &map[]
当您使用fmt.Println()
时,将应用默认的格式规则,对于*int
类型的值,它是%p
动词,它将以十六进制格式打印内存地址,但对于指向struct的指针,它将打印带有&
符号(&{}
)的结构值。您可以在相关问题中了解更多信息:
如果要打印指向的值,请取消对指针的引用并传递指向的值,例如:
var p = new(int)
*p = 12
fmt.Println(*p) // Prints 12
关于为什么要创建指向值(而不是值)的指针,请参见以下相关问题: