本文主要介绍 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 语言的指针可以看作一个存储地址的特殊变量类型。