Go语言 指针类型
值类型
值类型就是变量存的值,获取变量的地址,用&,比如: var a int, 获取a的地址:&a
指针类型
一个指针变量可以指向任何一个值的内存地址它指向那个值的内存地址,在 32 位机器上占用 4 个字节,在 64 位机器上占用 8 个字节,并且与它所指向的值的大小无关。当然,可以声明指针指向任何类型的值来表明它的原始性或结构性;你可以在指针类型前面加上 * 号(前缀)来获取指针所指向的内容,这里的 * 号是一个类型更改器。使用一个指针引用一个值被称为间接引用。
当一个指针被定义后没有分配到任何变量时,它的值为 nil。一个指针变量通常缩写为 ptr。
每个变量在运行时都拥有一个地址,这个地址代表变量在内存中的位置。Go 语言中使用&
作符放在变量前面对变量进行“取地址”操作。
格式如下:
ptr := &v // v的类型为T
指针用法
package main import ( "fmt" ) func main() { var cat int = 1 var str string = "banana" fmt.Printf("%p %p", &cat, &str) }
运行结果:
0xc042052088 0xc0420461b0
代码说明如下:
- 第 8 行,声明整型 cat 变量。
- 第 9 行,声明字符串 str 变量。
- 第 10 行,使用 fmt.Printf 的动词
%p
输出 cat 和 str 变量取地址后的指针值,指针值带有0x
的十六进制前缀。
输出值在每次运行是不同的,代表 cat 和 str 两个变量在运行时的地址。
在 32 位平台上,将是 32 位地址;64 位平台上是 64 位地址。
提示:变量、指针和地址三者的关系是:每个变量都拥有地址,指针的值就是地址。
在指针类型前面加上 * 号(前缀)来获取指针所指向的内容。
package main import "fmt" func main() { var a int= 20 /* 声明实际变量 */ var ip *int /* 声明指针变量 */ ip = &a /* 指针变量的存储地址 */ fmt.Printf("a 变量的地址是: %x\n", &a ) /* 指针变量的存储地址 */ fmt.Printf("ip 变量储存的指针地址: %x\n", ip ) /* 使用指针访问值 */ fmt.Printf("*ip 变量的值: %d\n", *ip ) }
结果:
a 变量的地址是: 20818a220
ip 变量储存的指针地址: 20818a220
*ip 变量的值: 20
Go 空指针
当一个指针被定义后没有分配到任何变量时,它的值为 nil。
nil 指针也称为空指针。
nil在概念上和其它语言的null、None、nil、NULL一样,都指代零值或空值。
一个指针变量通常缩写为 ptr。
查看以下实例:
package main import "fmt" func main() { var ptr *int fmt.Printf("ptr 的值为 : %x\n", ptr ) }
结果:
ptr 的值为 : 0
空指针判断:
if(ptr != nil) /* ptr 不是空指针 */ if(ptr == nil) /* ptr 是空指针 */
I can feel you forgetting me。。 有一种默契叫做我不理你,你就不理我