文章

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 进行授权