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教程附录指针的主要内容,如果未能解决你的问题,请参考以下文章

Go 系列教程 —— 15. 指针

基于Vue+Nodejs实现宿舍管理系统

基于Vue+Nodejs实现宿舍管理系统

Go 系列教程 ——第 19 部分:接口

Go 入门 - Go中的复杂类型

Go语言自学系列 | golang结构体指针