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的时候

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值