1、Golang指针
在介绍Golang指针隐式间接引用前,先简单说下Go 语言的指针 (Pointer),一个指针可以指向任何一个值的内存地址 它指向那个值的内存地址,在 32 位机器上占用 4 个字节,在 64 位机器上占用 8 个字节,并且与它所指向的值的大小无关。大致上理解如下:
- 变量名前的 & 符号,是取变量的内存地址,不是取值;
- 数据类型前的 * 符号,代表要储存的是对应数据类型的内存地址,不是存值;
- 变量名前的 * 符号,代表从内存地址中取值 (Dereferencing)。
使用一个指针引用一个值被称为间接引用。
注意 1:golang 指针Dereferencing(解引用)是什么意思?
在 Go 语言中,指针解引用(dereferencing)是指通过指针访问指针所指向的内存地址上存储的值。在指针变量前加上 * 符号可以进行指针解引用操作。指针解引用会返回指针所指向的内存地址上存储的值。例如,假设有一个指向int类型变量的指针:
要访问p指针指向的值,可以使用指针解引用:
可以看到,使用操作符访问指针指向的值时,需要将其放置在指针变量的前面。如果尝试使用操作符访问一个空指针,会引发运行时错误。因此,在解引用指针之前,通常需要确保指针不是空指针。
&*->.
nil
2、new函数
在 Go 语言中,new 函数用于动态地分配内存,返回一个指向新分配的零值的指针。它的语法如下:
其中,Type 表示要分配的内存的类型,new 函数返回一个指向 Type 类型的新分配的零值的指针。但是需要注意的是,new 函数只分配内存,并返回指向新分配的零值的指针,而不会初始化该内存。
注意 1:用new(structName):这个方法得到的是*structName类型,即类的指针类型;用structName{init para}:这个方法得到的是structName类型,即类的实例类型,不是指针。
注意 2:new函数更多细节介绍请参见《Go语言new( )函数》这篇博文。
3、Golang指针隐式间接引用
*p.fieldp.field
3.1 结构体类型指针隐式间接引用
p(*p).XXp.X
3.2 数组类型指针隐式间接引用
同样指向数组的指针可以隐式解引用数组中的元素。
3.3 切片类型指针隐式间接引用
切片实际上是对底层数组的封装,因此指向切片的指针可以隐式解引用切片中的元素。
3.4 字典类型隐式间接引用
map*
3.5func 类型隐式间接引用
*
例如,以下代码演示了函数类型指针的隐式解引用:
AddintintaddAddaddadd*
*
注意 2:在 Go 中,基本类型(如 int、float、bool 等)以及字符串类型等非引用类型都没有指针隐式解引用的行为。这意味着,如果需要访问基本类型的指针指向的值,必须显式地使用 * 运算符来解引用指针。下面是一个示例:
另外,对于基本类型而言,使用指针可能会导致性能下降。因此,在使用指针时应该谨慎,并且只在必要的情况下使用指针来传递数据。
4、总结
*p.fieldp.field