golang学习记录(10)
指针
指针是一个变量,其值为另一个变量的地址,即,内存地址。
指针类型的数据大小为固定值,32位系统为4字节,64位系统为8字节。
1、指针的定义和使用
取址符号:&
指针:*
传过去一个地址,通过指针进行接收
定义一个指针:
1
2
3
4
5
6
7
var a int = 10
var p *int = &a
// 定义了一个指针,p的类型为*int,p指向a的地址
//通过指针修改值
*p = 20
fmt.Println(a) //20
不同于C/C++语言中的指针,go语言中的指针限制了指针的运算,不能通过修改指针运算的方式访问其他内存的值
但是go语言在unsafe包中提供了一些方法,可以通过指针运算的方式访问其他内存的值,但是这种方式是不安全的,不建议使用。
2、指针的初始化
指针未初始化时,默认值为nil
在定义指针时需要进行初始化
指针初始化方式:
1
2
3
4
5
6
7
8
9
var a int = 10
var p *int = &a
var p2 = new(int) //new函数返回一个指针,指向一个新的int类型的值,值为0
// 如果是结构体还能用下面的方式
p := &Person{}
指针的初始化最好使用new的方式
map、slice、channel的初始化最好使用make方式
指针必须要初始化
map必须初始化
3、swap与指针
1
2
3
4
5
6
7
8
9
10
11
12
func swap(a, b *int) {
t := *a
*a = *b
*b = t
}
func main() {
var a int = 10
var b int = 20
swap(&a, &b)
fmt.Println(a, b) //20 10
}
4、go中的nil
在go中nil代表某一些数据类型中的零值,不同类型数据中的零值是不一样的
在结构体中nil代表结构体的零值,即所有字段都为零值,他是一个集合体,同时结构体可以通过 == 进行比较,比较的是结构体中的所有字段是否相等。
nil的slice本质上还是一个结构体,他是slice类型的零值,各个字段都是自己的零值。在make之后地址不是空值,而是指向一个地址(很重要)
nil的slice不能通过append进行添加元素,否则会报错,因为其地址元素为空。empty的slice可以通过append进行添加元素。(很重要)
本文由作者按照 CC BY 4.0 进行授权