每个变量都被初始化为零值 https://golang.org/ref/spec#The_zero_value如果您没有显式指定初始值,则为它的类型。所有指针类型的零值是nil
这意味着它还没有指向任何东西。
您可以随时将地址(指针值)分配给指针类型的变量。但是直到你初始化你的指针变量(除了nil
),它什么也没有指向,因此你不能将任何东西分配给它指向的地方(因为那是“什么也没有”)。
为了设置指向的值,请首先对其进行初始化,以便它实际上指向您可以设置/更改的某个位置。这个初始化可能是其他一些变量的地址(与指向类型相同的类型 - 称为element类型),或者由内置函数返回的指向类型的某些新分配的零值的地址new() https://golang.org/pkg/builtin/#new功能。
这条线
var b *string
只是创建一个新变量b
类型的*string
,但它没有指定任何初始值,所以b
将被初始化为nil
。它不指向任何东西(或任何地方)。如果您尝试设置pointed value:
var b *string
*b = "bar"
你会遇到运行时恐慌:
panic: runtime error: invalid memory address or nil pointer dereference
让您能够设置pointed值,您需要用非nil
指针值,例如:
b = new(string)
之后,您现在可以设置指向的值:
*b = "world"
请注意,当您这样做时:
var b *string
var c string = "bar"
b = &c
这会创建一个变量b
类型的*string
这将得到零值nil
。并创建一个变量c
类型的string
,并用值初始化它"bar"
。然后获取地址c
并将其存储在指针变量中b
。现在,如果您修改指向的值b
,这将“同时”修改变量的值c
因为b
指着c
(或者更准确地说b
存储内存地址在哪里c
是)。因此,如果在此之后您执行以下操作:
*b = "world"
然后打印两者的值c
and *b
,两者都将是"world"
:
fmt.Println(c, *b) // Prints "world world"