Go教程附录指针
Posted 玖五二七
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go教程附录指针相关的知识,希望对你有一定的参考价值。
为什么放附录?因为指针确实稍微涉及到一些计算机底层和硬件相关的知识,不想过早介绍,这里我们不深入,供参考,go的指针已经非常的简洁.比较容易掌握,也安全.
指针存在的意义是指向存值的内存地址
Golang中所有的变量都可以取出地址
变量,就是一块内存区域中存储的值。整型,字符串,数组,struct,都可以取到地址.使用地址运算符&可以取到变量的内存地址
import "fmt"
func Test()
a := 6
// &a表示一个地址
fmt.Println("addr = ", &a) // addr = 0xc0000aa058
// a表示地址里面的值
fmt.Println("value = ", a) // value = 6
结果如上所示.我们可以获取任何不同变量的地址
地址可以想象成实际生活中的一个具体地址,学校里面的宿舍有一个地址,教室有一个地址,每个地址里会有不同的容量空间,如一个宿舍可以容纳6层楼层,每层楼可容纳10个寝室,每个寝室又可以容纳4张床及一个卫生间.
与校园一样,计算机内部也为程序留出来类似的空间,里面有各种长啥样的房子,每个房子有它的地址,地址指向的空间又有类型.整型,字符串,布尔型等等
与之对应的, &a是一个宿舍的地址3号楼108,这个宿舍的类型是一个8人间的宿舍,现在里面有6个人
如果我们修改了a的值,为3,这个时候a的地址不会变,但是里面的值变成了3个人.
好比3号楼108宿舍刚刚有6个人,现在有3个人出去玩了,什么时候回来不知道,宿舍地址没变,8人间的容量也没变,只是里面的人出去了.现在剩3个人.
指针类型
指针的声明可以写为一个*符号,后面跟指针要指向的变量的类型
如指向int变量的指针类型写为*int
可以简单的理解为指针的类型是其他类型前面加个*
我们可以用reflect函数来显示指针的类型
import (
"fmt"
"reflect"
)
func Test()
a := 6
p := &a // 短变量声明:给指针变量赋值指向变量的内存地址
var p1 *int // 声明指针变量
p1 = p // 给指针变量赋值
fmt.Println("addr = ", p, p1)
fmt.Println("value = ", a)
fmt.Println(reflect.TypeOf(p))
fmt.Println(reflect.TypeOf(p1))
输出结果如下
addr = 0xc0000140a8 0xc0000140a8
value = 6
*int
*int
获取或修改指针的值
有两个比较绕的概念
- 指针变量的值 即p的值 0xc0000140a8 我们简称为指针的值
- 指针指向(引用)变量内存的值 *p的值 这里是指变量a int的值 我们简称为指针内容的值
可以通过*运算符来获取指针引用的变量的值
如获取 a 的值,可以输入 *p 可以理解为获取p所指向变量的值
fmt.Println("p ref value = ", *p) // 获取指针的值
*p = 3 // 修改了指针p指向内存地址的值
fmt.Println("p ref value = ", *p) // 获取指针指向变量的值
fmt.Println("a value = ", a) // 获取a的值
上面的代码修改了p指针内容的值,这是一个底层a的值,所以a变了,包括p1内容的值也变了
但是p1 p是不变的
结果如下
p ref value = 6
p ref value = 3
a value = 3
指针类型的值什么时候变化
发生moving GC的时候
以上是关于Go教程附录指针的主要内容,如果未能解决你的问题,请参考以下文章