Go语言入门(18)-指针(上)
变量会将它们的值存储在计算机的RAM里,存储位置就是该变量的内存地址。
“&”表示地址操作符,通过该字符可以获得变量的内存地址,但该操作符无法获得字符串/数值/bool值的地址。
“*”操作符与“&”的作用相反,它用来解引用,提供内存地址指向的值。下面来看一个简单的例程。
package mainimport "fmt"func main() {canada := "Canada"var home *stringfmt.Printf("home is a %T\n", home)home = &canadafmt.Println(*home)var administrator *stringBolden := "Charles F. Bolden"administrator = &Boldenfmt.Println(*administrator)major := administrator*major = "Major General CHARLES Frank Bolden Jr."fmt.Println(Bolden)//两个指针变量持有相同的内存地址,那么它们就相等,而内容不一定要完全一致。fmt.Println(administrator == major)lightfoot := "Robert M. LightFOOT Jr."administrator = &lightfootfmt.Println(administrator == major)
}
两个指针变量持有相同的内存地址,那么它们在编译器里就被认为是相等关系。指针就是用来指向的
在go语言中,可以非常方便地直接使用Println()来比较两个变量,返回值为boll类型。以上例程为例,如果两值相等,返回True,不相等返回False。
下面再来讲一下指向结构的指针。与字符串和数值不同,符合字面值地前面可以放置“&”。访问字段时,对结构体进行解引用并不是必须的。下面看一个例程
package mainimport "fmt"func main() {//与字符串和数值不一样的是,复合字面量的前面可以放置“&”type person struct {name, superpower stringage int}timmy := &person{name: "Timothy",age: 10,}//访问字段时,对结构体进行解引用并不是必须的。//(*timmy).superpower = "flying"timmy.superpower = "flying"fmt.Printf("%+v\n", timmy)}
指向数组的指针:
和结构体一样,可以把“&”放在数组的符合字面值前,来创建指向数组的指针。
数组在执行索引or切片操作时,会自动解引用,没有必要写(*superpower)[0]这种形式。
与C语言不同,Go里面数组和指针是两种完全独立的类型。
Slice和map的复合字面值前面也可以放置“&”操作符,但Go并没有为它们提供自动解引用的功能。