Pointers 指向结构或数组值的指针如何工作?

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之类的基元,怎么可能指向一个值呢?奇怪的是,以下内容

考虑到以下Go结构:

type Person struct {
    Name    string
    Age     int
    Country string
}
我在以下使用中遇到过无数次:

p := &Person{"Adam", 33, "Argentina"}
然而,我看不到指向结构值的意义,我想知道,它与:

n := &999 // Error
我的问题是:

  • 即使它是一个结构或数组而不是字符串或int之类的基元,怎么可能指向一个值呢?奇怪的是,以下内容无助于我的理解:

    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
    
    关于为什么要创建指向值(而不是值)的指针,请参见以下相关问题: