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"