如果说变量名
是数据的“代号”,那么指针
存放的则是数据的“实际地址”。
我们可以通过这个地址获取或修改存放于这个地址的变量的值。
当然,指针的存储位置也是用值记录的,存放指针值的变量称为指针变量
。
Go语言中的指针,它主要由两大核心概念构成:类型指针
和切片指针
。
类型指针
:
go 会根据变量对应的数据类型,完成相应的内存分配,并创建一个指针,指向该内存空间。
相关信息
在传递数据时直接使用指针,可以避免创建数据的副本,节约内存开销。 类型指针不能进行偏移和运算,可以避免非法修改为其它数据的风险,也更有利于垃圾回收机制及时找到并回收
切片指针
:
切片由指向起始元素的指针、元素数量和总容量构成。适用于切片类数据
使用指针更有利于程序运行的性能和稳定性。 在某些操作中,如使用反射修改变量的值,必须使用可寻址的变量(通过指针)。
指针的操作最常用的就是:
&
运算符*
运算符go//exampleNumberA变量(整数型变量)声明和赋值
var exampleNumberA int = 10
// 空指针,默认初始化的值为 nil
// nil 是 Go 中预先声明的标识符,表示指针、接口、通道、映射和切片的零值。
var p *int
fmt.Println(p)
// & 运算符
//获取exampleNumberA的地址,并赋值给exampleNumberAPtr变量(exampleNumberAPtr的类型是指针类型)
exampleNumberAPtr := &exampleNumberA
//输出exampleNumberAPtr变量的值(将输出内存地址)
fmt.Println(exampleNumberAPtr)
// * 运算符
//获取exampleNumberAPtr(指针变量)表示的实际数据值,并赋值给exampleNumberAPtrValue变量(整数型变量)
exampleNumberAPtrValue := *exampleNumberAPtr
//输出exampleNumberAPtrValue变量(整数型变量)的值
fmt.Println(exampleNumberAPtrValue)
我们还可以使用new()
函数直接创建指针变量,相当于在内存中创建了没有变量名的某种类型的变量。
也就是直接分配一个内存地址,但并不与变量名关联
new()函数的使用格式如下:
go// type是所在地址存放的数据类型,一旦创建,就会完成内存分配,即使没有赋值
new(type)
go//使用new()函数创建名为exampleNumberAPtr指针类型变量,表示int64型值
exampleNumberAPtr := new(int64)
//修改exampleNumberAPtr表示的实际数据值
*exampleNumberAPtr = 100
//获取exampleNumberAPtr表示的实际数据值
fmt.Println(*exampleNumberAPtr)
// 运行后,结果为100
本文作者:Silon汐冷
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!