本文主要介绍 Go 语言中的指针。Go 语言中和 C/C++ 一样,直接提供了指针类型,但是不同的是 Go 语言的指针并没有那么高深莫测,因为它是无法进行位移和运算的,它只是一个存储了其它变量地址的变量而已。它在 Go 语言中最大的作用就是在值传递的过程中减少内存消耗,毕竟一个地址的存储开销是十分少的。

1. 指针的定义和使用

在 Go 语言中指针类型的声明和 C/C++ 类似,都是采用 * 符号来区分正常类型变量和指针变量。

代码示例

package main

import (
    "fmt"
)

func main() {
    str := "Hello World !"
    var strP *string
    strP = &str
    *strP = "Hello Codey !"
    fmt.Println("指针strP的地址为", strP)
    fmt.Println("指针strP指向的值为", *strP)
    fmt.Println("变量str的地址为", &str)
    fmt.Println("变量str的值为", str)
}
  • 第 9 行:使用 *+变量类型的形式声明一个 string 类型的指针。
  • 第 10 行:将指针 strP 指向变量 str,也就是将变量 str 的地址赋值给指针变量 strP 。& 为取地址符,可以取出变量所在的地址。
  • 第 11 行:通过指针修改 str 的值。

执行结果

图片描述

从以上输出结果可以看出,变量 strP 存储的值就是变量 str 的地址,可以通过使用 *strP 操作符改变其存储的地址所存储的值

2. 指针作为函数的参数

Go 语言中只有值传递,没有引用传递,因为引用传递设计之初是为了解决函数想要有多个返回值的问题,但是 Go 语言的函数自带多返回值的返回方式。所以想要指针作为参数传入函数中,只能传递地址进入函数进行修改,并不能直接引用指针参数,这一特点就大大降低了 Go 语言指针的使用难度。

代码示例

package main

import (
    "fmt"
)

func main() {
    a := 10
    b := 20
    fmt.Println("交换前的a=", a, "b=", b)
    swap(&a, &b)
    fmt.Println("交换后的a=", a, "b=", b)
}

func swap(a, b *int) {
    *a, *b = *b, *a
}
  • 第 11 行:将变量 a 和 b 的地址作为函数 swap 指针参数的值传入函数;
  • 第 16 行:交换这两个指针保存的地址所保存的值。

执行结果

图片描述

3. 小结

本文主要讲解了 Go 语言中指针的使用,以下为注意事项:

  • Go 语言的指针不可以做偏移
  • Go 语言的指针可以看作一个存储地址的特殊变量类型