11. Go语言指针
2025年2月14日大约 2 分钟Go语言Go语言golanggo基础语法指针
Go语言指针
指针是什么
像c语言一样,Go语言也有指针的概念。简单理解,指针就是地址,指针变量就是存放地址的变量。在一个变量前加上*,那么这个变量就是指针变量,指针变量只能存放地址。
1个指针变量可以指向任何一个值的内存地址,它所指向的值的内存地址在32和64位机器上分别占用4或8个字节,占用字节的大小与所指向的值的大小无关。
创建指针
声明指针
我们可以像声明其它类型的变量一样,声明一个指针变量
var a *int
上述方法声明了一个整形指针变量a,但是该变量还没有存放任何地址,操作系统并未为其指向的内容分配内存,即该指针没有指向任何内容,所以它是一个空指针。
var b int = 3
a = &b
此时a不再是一个空指针,a指向一个整形变量,该变量的值是3。
要获取指针变量所指向的内容,很简单,在变量前加*即可
package main
import "fmt"
func main() {
var a *int
fmt.Printf("赋值前a: %v\n", a)
var b int = 3
a = &b // a存放的是b的地址
fmt.Printf("赋值后a: %v\n", a) // 打印出b的地址
fmt.Printf("a指向的内容是: %v\n", *a) // *a表示a存放的地址对应的内存存放的内容,这里为整数3
}
运行结果:
赋值前a: <nil>
赋值后a: 0x14000018000
a指向的内容是: 3
new()函数
Go语言还提供了另外一种方法来创建指针变量,使用new
函数创建
new(type)
代码展示:
package main
import "fmt"
func main() {
s := new(string)
fmt.Printf("赋值前s: %v\n", s)
fmt.Printf("赋值前s的内容: %v\n", *s)
*s = "Golang学习之路"
fmt.Printf("赋值h后s: %v\n", s)
fmt.Printf("赋值后s的内容: %v\n", *s)
}
运行结果:
赋值前s: <nil>
赋值前s的内容:
赋值后s: 0x14000018000
赋值后s的内容: Golang学习之路
可以看到,通过new函数创建指针的时候,系统会为其分配内存,所以两次都能打印出地址,但是,在没有对其赋值的时候,系统会存放默认值,string类型的就是空字符串""。