Go(三)指针和结构体

一、指针

Go拥有指针。指针保存了值的内存地址。类型 *T 是指向 T 类型值的指针,其零值为 nil; Go 没有指针运算

var p *int

& 操作符会生成一个指向其操作数的指针。

i := 42
p = &i

  • 操作符表示指针指向的底层值。这也就是通常所说的“间接引用”或“重定向”。

    fmt.Println(p) // 通过指针 p 读取 i p = 21 // 通过指针 p 设置 i

1
2
3
4
5
6
7
8
9
10
11
12
13
14
func PointerDemo()  {
//声明两个变量
i, j := 42, 2701

p := &i // 指向 i
fmt.Println(*p) // 通过指针读取 i 的值 42

*p = 21 // 通过指针设置 i 的值
fmt.Println(i) // 查看 i 的值 21

p = &j // 指向 j 2701
*p = *p / 37 // 通过指针对 j 进行除法运算 2701/37
fmt.Println(j) // 查看 i 的值 73
}

二、结构体

结构体(struct)就是一个字段的集合。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
func PointDemo()  {
//声明一个结构体
var point = Point{2,3}
fmt.Println(point) //{2 3}

//声明一个结构体
var point2 = Point{}
fmt.Println(point2) //{0 0}

//结构体字段使用.来访问
point2.x = 10 //给x赋值
point2.y = 5
fmt.Println(point2, point2.x, point2.y) //{10 5} 10 5
}

三、结构体指针

结构体字段可以通过结构体指针来访问。
如果我们有一个指向结构体的指针 p,那么可以通过 (*p).X 来访问其字段 X。不过这么写太啰嗦了,所以语言也允许我们使用隐式间接引用,直接写 p.X 就可以。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
func StructPointer() {
fmt.Println("结构体指针...")

//声明结构体
point := Point{2,3}
fmt.Println(point) //{2 3}

p := &point //指针 取得point内存
p.x = 1024
fmt.Println(point) //{1024 3}

point3 := &Point{1, 2}
fmt.Println(point3) //&{1 2}
}