菜鸟笔记
提升您的技术认知

Go 指针

指针

指针是Go语言的基本复合数据类型之一,它保存的是指向目标变量的地址。指针字面量使用*后跟其指向的类型名表示(*T)。Go同样支持多级指针(例如**T,表示指针的指针),通过在变量名前加&来获取变量的地址。

声明

使用var关键字可以声明一个指针类型,也可以在赋值语句中使用简短模式声明指针类型。

// 使用var声明一个指针
var (
    pointer *uint
)

// 简短模式声明一个指针
number := 3
pointer := &number

取地址

通过在变量名前加&来获取变量的地址。下面的例子中声明了一个指针变量pointer,pointer保存了整型变量number的地址。在下例中的代码每一次运行的结果输出都不一样(即pointer保存的地址不一样),是因为Go的内存分配器在每一次运行期间对变量的内存分配不一定与上一次相同。

package main

import (
    "fmt"
)

func main() {
    number := 11
    pointer := &number
    fmt.Println(pointer)
    // output: 0xc000018068
}

结构体指针

结构体指针访问结构体字段仍然使用"."操作符,这与结构体变量相同。

package main

import (
    "fmt"
)

type Student struct {
    Name  string
    Age   int
}

func main() {
    student := &Student{
        Name: "Luca",
        Age: 15,
    }

    fmt.Println(student.Age)
    // output: 15
}

指针的运算

不同于C/C++,Go不支持指针运算。例如下面的代码会出现错误:

package main

func main() {
    number := 23
    pointer := &number
    pointer++    // build error: invalid operation: pointer++ (non-numeric type *int)
}