Pointers Go指针优先分配

Pointers Go指针优先分配,pointers,go,initialization,Pointers,Go,Initialization,当我玩弄闭包时,我偶然发现了这种行为。我不能把我的头绕在它周围 此代码段可以工作: func main(){ var a string = "foo" var b *string var c string = "bar" b = &c fmt.Printf("%s %s\n", a, *b) a = "hello" *b = "world" fmt.Printf("%s %s\n", a, *b) } 鉴于此不: f

当我玩弄闭包时,我偶然发现了这种行为。我不能把我的头绕在它周围

此代码段可以工作:

func main(){
    var a string = "foo"
    var b *string
    var c string = "bar"
    b = &c

    fmt.Printf("%s %s\n", a, *b)

    a = "hello"
    *b = "world"

    fmt.Printf("%s %s\n", a, *b)
}
鉴于此不:

func main(){
    var a string = "foo"
    var b *string
    *b = "bar"

    fmt.Printf("%s %s\n", a, *b)

    a = "hello"
    *b = "world"

    fmt.Printf("%s %s\n", a, *b)
}


请比我聪明得多的人解释一下。

如果不明确指定初始值,每个变量都会初始化为其类型的类型。所有指针类型的零值都是
nil
,这意味着它没有指向任何东西

您可以随时将地址(指针值)分配给指针类型的变量。但是,在初始化指针变量(指向除
nil
之外的任何对象)之前,它不指向任何对象,因此无法将任何对象分配到它所指向的位置(因为这是“无”)

为了设置指向的值,首先对其进行初始化,使其实际指向可以设置/更改的位置。这个初始化可能是其他变量的地址(与点类型相同的类型-称为元素类型),或者是由内置函数返回的点类型的一些新分配的零值的地址

这条线

var b *string
只创建一个类型为
*string
的新变量
b
,但它没有指定任何初始值,因此
b
将初始化为
nil
。它没有指向任何东西(或任何地方)。如果尝试设置指向的值:

*b = "world"
您会遇到运行时恐慌:

panic: runtime error: invalid memory address or nil pointer dereference
为了能够设置指向的值,需要使用非
nil
指针值对其进行初始化,例如:

b = new(string)
在此之后,现在可以设置定点值:

*b = "world"
请注意,执行此操作时:

var b *string
var c string = "bar"
b = &c
这将创建类型为
*string
的变量
b
,该变量将获得零值
nil
。并创建类型为
string
的变量
c
,并使用值
“bar”
对其进行初始化。然后获取
c
的地址,并将其存储在指针变量
b
中。在这之后,如果您修改
b
所指的值,这将“同时”修改变量
c
的值,因为
b
指向
c
(或者更准确地说
b
存储
c
所在的内存地址)。因此,如果在此之后:

*b = "world"
然后打印
c
*b
的值,这两个值都将是
“world”


这段视频解释了C指针,但这一课也适用于go。谢谢你的视频。我知道它在C语言中是如何工作的,但我从未意识到它在围棋中也是一样的。愚蠢的我。但是引用对象的指针对象是新的。其实很合适。
fmt.Println(c, *b) // Prints "world world"