00:00
同学们,我们继续来学习咱们的go浪语言,Go浪呢,我们现在为大家讲解一下子类型和引用类型,OK,那么子类型和引用类型呢,在前边我们没有怎么提过,在这里呢,我们再给大家详细的介绍一下,首先呢,这里先给大家介绍一下我们在工工浪里面的值类型和引用类型的常见有哪些。所以说先看这个值类型啊,值类型呢,我们的基本数据类型。对不对,然后还有这个,呃,就是数组和结构体都是属于直类型的,前面说过这个事。那么引用类型有哪些呢?各位朋友,引用类型有指针、切片、map、管道接口等,这都是引用类型。当然有些同学说了,说老师切片map管道还有接口,我们都还没有学过呀,是的,虽然我没学过,但是呢,我先把它给大家拿出来放到这儿,因为以后在提及这个map或者其他这几个数据类型的时候呢,大家心里面要知道哦,老师讲过这几个呢,都是属于引用类型的。
01:11
所以说这块大家呢,一定要有一个印象啊,就是说哪些是直类型。哪一些是引用类型?面试官,或者说我们在工作中的时候,一定要把这几这两大类给他分清楚。那我先把这块呢,放到咱们的笔记中去。那我们说一下这个值类型和引用类型。值类型和引用类型。啊,引用类,引用类类型好,先把它放好啊。好,给他来一个标题二。那刚才老师已经说了,值类型有哪些,引用类型有哪些啊,我们要有一个基本的认识。之类型有哪些?引用类型有哪些?我们把它放到笔记里面来,大家也可以认识啊,看一下。
02:01
这个呢,同学们一定要记住有哪些事实类型。好哪一些是引用类型对吧。我把它整理一下。值类型和引用类型就是这样子的,那问题来了,说老师那值类型和引用类型它导致的这个区别在什么地方呢?大家听我说啊,这是他们的说明啊。就是直类型。和引用类型有哪些的这个说明。就是哪些是引用类型,哪些是指类型。对吧。诶,整体往这边挪一下吧。整体往这边挪一下。那引值类型和引用类型,它最终在这个在使用的时候会造成什么样的区别呢?我们来看这里有一张图,就说值类型和引用类型的使用特点。如果你是值类型,那么变量直接存储值。
03:03
注意听这句话啊,变量直接存储就是我们这个值。内存呢,通常在占中分配。也就是说我们的值类型呢,通常是在站里面给他分配这个空间的。当然有同学说,老师这个赞我还不太理解啊,如果你还不理解什么叫赞,没有关系,后边呢,我在讲这个,讲后面数组的时候,还会具体说,也就说你可以这样理解,你可以这样理解,就在我们的这个内存里面分成两大块儿,一块呢叫占,一块呢叫堆。一块叫站,一块叫堆,听我说啊,那么我们的变量就说直类型的变量呢,通常分配在占中的,也就是说你可以这么理解啊,你可以这样简单的先理解一下,说这是我们的一块内存。注意听,这是我们的一块内存。对吧,这是一块内存嘛,没问题,那么这个内存呢,它从这个存储空间来说,分成了两大块儿,两大块儿。
04:08
那一块儿呢。一块儿。啊,我们把它叫做战。战区。还有一块呢,我们把它叫做堆曲。当然了,除了在和堆呢,它可能还有其他的地方,比如说代码区什么的,对吧,等等代码区啊,那么这块呢,我们把它在叫堆区。对。堆区啊,当然可能还有其他的这个区,我们先不说那么多啊,就说从这个数据存储来说呢,有两大块儿,一块叫占,一块叫堆,那么我们这个直类型。直类型的这个数据呢,通常通常是在这个战区,注意我说的是通常啊。在呃,Go浪里面呢,它有个特点,它有个叫做编译逃逸分析,也就是说有可能值类型也在堆区。
05:03
明白吗?反过来也是一样,有可能你的一个引用类型呢,在战区也是有可能的。啊,但是呢,这个呢,并不影响我们对程序的理解。啊,并不影响,因为站和堆本身就是逻辑的概念。逻辑的概念,明白我的意思吧,所以说你先记一个它的一个大体的大体的一个概念,那么引用类型呢?听我说引用类型看这里。你看我这画了一个图啊,引用类型呢,变量存储的是一个地址,比如说前面我们学的指针,这个地址对应的空间才是真正存储的这个值。内存通常在堆去分配分配的,当没有任何变量引用这个地址时,该地址对应的数据空间就成为了一个垃圾。这时就会有GC来进行回收。啊,这是它两两种数据类型的区别,也就是说我们的这个引用类型。
06:01
就是说我们说的引用类型通常。通常在堆区分配。堆区分配空间。分配这个数据空间就叫空间也行啊,空间,但是呢,还是要记住啊,我这说的是通常。我还是说的那句话,就是呃,公浪里面它有逃逸分析,所以说呢,逃逸分析就这个词啊,叫逃逸分析,它的编译器有个叫逃逸。逃逸分析,因此这个逃逸分析来了过后呢,这个编译器会根据实际的情况来决定到底放哪,只是说这是通常从通常情况下是分配到这的,但不是说绝对明白,明白这意思吧,好,那大家再看我这画了两个图,注意听这句话,画了两个图,一个呢就这这个就是我们值类型的分配的一种内存的布局。那如果是引用类型呢?就是说它引用类型指向了一个地址,这个它存,呃,引用类型它指向了一个空间,这个空间存的是地址,这个地址指向的才是真正存储数据的地方。
07:05
就跟我们上节课讲的指针是一个道理,能理解吧?好这块呢,先做一个,呃,这个认识啊,先做一个认识好的,我呢把这一块说明先给同学们放到笔记里面来。对不对,好,就是直类型。值类型和引用类型的使用特点。好,我先把它放好。使用特点。那刚才呢,老师已经做了一个基本的介绍,对不对,一个是之类型。好,我把这个呢,排版稍微的整理一下啊,排版稍微整理一下类型和引用类型。这有一个示意图。二这一个示意图。这个示意图呢,我也给同学们放到笔记里面来,这样子呢,以后大家就不用再去看幻灯片了。放好。对吧,还有呢,这个在我们引用类型呢,它的使用也有一个示意图。
08:03
我也把它放到这里啊示意图。没问题吧,我把示意图呢也放到咱们的笔记里面。好,最后呢,还有一个,呃,刚才老师在这画的这个图啊,这个图就是我们这个内存,你可以理解成它。它的数据可以存在站或者放堆。那么我们的值类型呢,通常放在战区,引用类型呢,通常放在对区,注意是通常两个字啊。不是绝对就百分之八九十就这样放的,但是呢,刚才我讲过了,堆区和战区都是逻辑的概念,大家不用把这个好像搞得好像就是就说特别特别的区分的特别严格。实际上在很多编程语言里面呢,这个战区,堆区,它在它是一个逻辑概念,其实他也后面甚至有些编译器已经把堆区和战区的这个区别都取消了。像勾浪里面,它这个堆砌和战区区分的就不是特别的明确,它主要是根据你这个变量到底使用多长时间来决定放在什么地方,比如说你有一个引用类型,它使用的生命周期很长,那我就放堆缺。那么。
09:16
反过来一样,假设我这个有一个基本数值类型,但是这个使用类型呢,它在别的这个别的这个呃函数里面也用到,所以它又有可能帮堆区它做逃逸分析,明明白我意思吧,因为这个我们功能里面有指针这个这个数据类型在里边,好大家先这样子理解啊,理解后边呢,我们再详细的后面在使用到一个程序的时候,再详细的分析他们的具体情况啊,具体情况好的,那现在呢,把它这个内存的计算机内存的一个分布的一个示意图也给同学们放到笔记里面来。好,同学们,这是内存的一个分析图。好,我也写个三吧。
10:01
内存的占区和堆区。堆区啊。堆区示意图。大家有一个基本认识。好,我把这个图呢放在我们的笔记里边。好吧。那典型的案例,典型的案例就是我们上节课讲的像整数。就是指类型引用,类型就是上节课我们讲的指针,它就是这种内存布局的明白。好,同学们,那关于值类型和引用类型的这个它的一些基本的介绍呢,我们先给大家介绍到这,后边关注它的深入的使用方式,我们在具体的代码里面还要具体分析。好,这块呢,我们先给大家介绍到这里。
我来说两句