这是我参与「第五届青训营 」伴学笔记创作活动的第 12 天
一、本堂课重点内容
本堂课的知识要点有哪些?
- Go语言指针
二、详细知识点介绍
本堂课介绍了哪些知识点?
Go语言指针
-
我们可以专门定义一种数据类型来表示内存地址,这种数据类型的变量就称为地址变量,任何其它数据类型变量的地址都可以赋值给这类地址变量。在Go语言中这种专门用来表示地址的变量就称为“指针”。
-
Go语言中专门有一个取地址操作符
&,只要把取地址操作符放在变量名前面就可以了。格式为:&变量名。 -
需要强调的是,变量的地址是该变量在内存中的首字节地址。对于
byte类型的两个变量,其地址编号是连续的。而对于两个int64型的变量来说,其地址就不是连续的了。因为每个变量需要占8个字节,两个变量的地址之差就为8。 -
指针变量也和普通变量一样,须先声明后使用。Go语言的指针变量采用以下方式声明:
var 指针名称 *数据类型 -
如果指针变量声明的时候没有赋值,则编译系统会给一个默认初始值,指针变量的默认初始值为空,即为
nil。nil指针不指向任何位置,随时可以被赋值。大多数的情况下,指针都是在声明的同时就赋值。如:var x int = 10 var p *int = &x -
Go语言不支持指针运算,与C语言差别很大,使用的时候一定要注意。
-
Go语言的指针也不支持字符串及切片的索引运算。
-
指向数组的指针索引是支持的,也就是说,如果指针
p是指向数组array的,则array[10]与p[10]是等价的。 -
可以用指针来代替数组,这样传入函数的仅仅是一个指针,也就几个字节,代价很低。在函数内部完全可以用指针来引用数组元素,效果一样。而且还有一个好处,可以实现函数的多返回值。
-
在Go语言中,字符串也是按值传递的,按值传递就会导致字符串复制副本传入函数。因而,对于大字符串来说,也是很浪费内存资源的,使用指针就可以节省很多内存资源。
-
在Go语言中结构体也是采用值传递的,很显然,大型结构体的副本也会占用系统较大的资源。为此,可以用指向结构体的指针来代替结构体,作为实参传入函数,这样就可以在函数中通过指针直接操作结构体字段。需要注意的是,直接操作结构体字段是有副作用的,操作的结果会影响原值。
-
直接指向数据变量的指针称为一级指针,指向一级指针的指针称为二级指针,指向二级指针的指针称为三级指针,以此类推,可以出现更多级指针。
-
只有同级指针才可以相互赋值,不同级别的指针是不能相互赋值的。