当前位置: 首页 > 科技观察

一篇文章带你了解Go语言指针基础

时间:2023-03-11 23:58:46 科技观察

前言大家好,我是星期五。Go作为21世纪的C语言,可能会有很多思考,最后还是保留了指针。但是比C语言的指针要简单的多,一起来看看吧。简介因为Go语言是类C语言,为了效率还是保留了指针。但是如果你没有接触过指针,你可能需要在学习指针方面多花些心思。通常,指针也被称为小白说服魔法。要理解基本类型指针,先看这两行代码。varn1int=666fmt.Println(n1)//result:666fmt.Printf("%p\n",n1)//result:%!p(int=666),表示要么是地址,要么是值内存分布图如下。再看这两行代码,其中用到了&。varn1int=1//表示n1的地址fmt.Println(&n1)//result:0xc00000a0b8fmt.Printf("%p\n",&n1)//result:0xc00000a0b8如图。如果这两位能看懂,恭喜,指针已经讲到一半了。要理解引用类型指针,首先要看这样的代码。varstudentList=[]string{"张三","李四"}//一个切片fmt.Println(studentList)//result:[张三李四]fmt.Printf("%p\n",studentList)//result:0xc0000044a0//转到地址fmt.Printf("%p\n",&studentList)//result:0xc0000044a0内存分配如下。值类型和引用类型值类型在Go中,主要有值类型。int、float、bool、string、array、struct(结构体)的内存分布大致如下。注意:字符串、数组、结构体属于连续存储,变量指向其首地址,其余按长度计算。引用类型在Go中,主要有引用类型。切片(slice)、映射、流水线(chan)内存分布大致如下。栈内存和堆内存的区别。栈内存只能存放一些简单的东西,比如数字、字符、浮点数等,但是栈内存分配的内存不需要程序员回收,系统自己回收。,并且具有高性能。堆内存在存储方面更加丰富。可以随便存,像map一样,可以随便塞,但是堆内存分配的内存需要程序员回收。一个典型的例子,C++,如果语言被GC回收,性能稍微弱一点……,但是人可以随便救,就这么随便。&和*&的含义称为地址符号。*称为接收地址字符。例子varc*int//*int是一个整体,说明变量c只能接收int类型*int是一个整体,说明变量c只能接收int类型的地址。代码packagemainimport"fmt"funcmain(){varc*intvardint=1//c=d//报错需要d的地址c=&dfmt.Println(c)}执行结果。可以看出打印出来的也是一个地址,但是内存映射还是基本类型映射。如果要打印c的值,直接*c即可,得到的值就是地址中对应的值。fmt.Println(*c)关于函数,我们一直在强调操作只会对栈上的值进行操作,函数也是一样的。packagemainimport"fmt"funcsay1(xint){//xint相当于隐藏了一行代码//在代码中隐藏了varxint=x的时候,一定要记住这个fmt.Printf("say1:%p\n",x)}funcsay2(x*int){//隐藏代码是varx*int=x,x是一个地址fmt.Printf("say2:%p\n",x)}funcsay3(x[]int){//Hidden代码是varx[]int=x,因为x是引用类型,所以x是一个地址fmt.Printf("say3:%p\n",x)}funcmain(){say1(1)//栈顶是1,所以传入为1varx1=1say2(&x1)//say只能接收整数地址varx2=[]int{1,1}say3(x2)//x2是引用类型,所以传入时是地址,入栈就是地址}执行结果。综上所述,我们主要讲了基本类型指针和引用类型指针,也叫值类型和引用类型,画了值类型和引用类型内存的本质区别图,然后讲了&和的区别*,和functions参数传递的本质是什么,希望对大家的学习有所帮助。如果您在操作过程中有什么问题,记得在下方留言,我们看到会第一时间解决。本文转载自微信公众号《Go语言进阶学习》,可通过以下二维码关注。转载本文请联系Go语言进阶学习公众号。