00:00
各位,我们接着来看一下勾浪里面的内置函数,首先我们看一下什么叫内置函数,Go让设计者为了编程方便建了一些函数,这些函数可以直接使用,我们称为勾让的内置函数,也就是说这一大块。大家看到在这块叫building in。Build in这个地方。OK,它的函数呢,很多,你看见没有很多,那么现在我们能讲的,或者说现在能够说的呢,有一个嫩,这个嫩是不是我们刚才已经讲过了,对吧?嫩这个呢,就是可以统计字符串的长度,或者是统计一个数组的大小,这个是可以的,呃,其他的现在一时半会还讲不了,因为我们目前能能够讲的一个是嫩,还可以讲一个什么呢?讲个六。九六这个六是干什么,看一下六。内建函数六分配内存,其第一个时差为类型,就是这是一个类型,就是什么样的类型。
01:01
然后而非值,就是说你指定一个类型,其返回值为指向该类型的新分配的零值的指针,呃,这个呢,还是很有意思的啊,就是呃,这个就说其返回的值为指向该类型的新分配的零值的指针,理解起来好像有点不太好理解,那么我给大家来讲一下,这块呢,那我就不说了。那你前面已经讲过了,对吧,我们重点讲一下六。好,我把这块先给同学们拿过来。放到这,我们说一下内置函数。内置函数,内置函数也叫内建函数。给他来一个标题二。给大家一个标题二,那首先呢,我们做了一个说明。说明然后呢,这里面常用的这个函数,一个是嫩。我们在前面已经说过这个东西了。诶。好,那还有一个六,这个六呢,是这样子的,同学们,这还有个make,等一下啊。
02:07
整理一下他这样子的。六可以用来分配内存,主要是用来分配值类型的,前面我们前面我们讲的呢,去创建去分配一个整形float或者是字符串呢,我们基本上就是直接赋值的,其实它还可以直接用来分配一个指针,也可以达到同样的效果,我给大家举个例子。大家看我举例说明这个六的使用。举例说明六。六的使用。OK,我们看一个案例。举例说明六的使用。我们打开这个。我们的Vs code,我新建一个文件啊,我新建一个文件,比如说。我新建一个文件夹吧,好吧,新建一个文件夹,这个呢,我们叫build。
03:00
Build in function。Build in function,然后呢,里面新建一个文件叫main go。好,同样,我们先打一个包包,Package me。然后呢,我们引入format包。不包,然后呢,我们写一个主函数。好,大家看一下,那现在呢,我们来看一个这样的案例,比如比如说我们以前这样给一个值,比如说number。一等于。等于100,好,同学们,这这种用法是我们最常见的用法,就是把一个100付给。这个NUMBER1,那这个时候呢,我们来输出它的类型和它的地址,我们看一下啊,首先呢,同学们看一下NUMBER1。的类型是。它的类型,类型是什么?就是整数对吧,就是一个整数,这个我们不就就写到这,然后NUMBER1的值呢,它的值是多少值。
04:03
就是他付给他的这个100,还有一个NUMBER1的地址是多少。我们做一个比较,待会地址它的地址呢,我们也把它输出来,来走一个,第一个NUMBER1类型,第二个NUMBER1址,第三个类型地址,地址呢,我们把地址取出来,NUMBER1。所以说像这种。最常规的复制方式,其实它是这个样子的,就是可以拿到类型,也可以拿到纸,也可以拿到地址,那待会儿呢,我们画一个内存图来分析一下。这样一对比就比较好说了,来,我看一下。然后呢,我CD到这个chapter,诶,我们CD到。Cold。然后CD到CHAPTER06。零六,然后CD到build。然后go wrong,命题go。跑起来。
05:00
我们可以看这个结果。这个结果首先告诉你,Number类型是int。NUMBER1的值是100 number1的地址是0X什么什么什么,那如果说我们画一个内存图来说的话呢,它的示意图就应该是这个样子的,打开我们的这个示意图。我们画一个图来进行一个比对,画一个图进行一个比对,比如说现在我这有一有一段代码,就是刚才老师写的这段代码对不对。老师写的这个代码,我们先把它拿过来。拿过来,拿过来过后呢,我把它放到这里。放到这儿。没问题吧,比较简单,然后呢,我们看一下内存图,它是怎么一个情况。假设这是我们的一块内存。这是我们的一块内存,如果是按照这种写法的话呢,在我们内存里面,它是这样分配的。内存图。那首先呢,这会儿有一个。有一个变量叫NUMBER1。
06:02
好,我可以现在把它拿过去了。NUMBER1呢,它指向了一个空间。注意听它指向那个空间,好,这个空间我给他来一个新的不同的颜色,这个地方放了一个多少呢?放了一个100。放了一个100,好,我我这边挪一下,那么NUMBER1呢,就直接关联到这个位置来了。OK,那NUMBER1的地址取的这个地址就是同学们现在看到的这个,这个地址其实就是它指向这个空间的这个地址,这个地址是多少呢?刚才同学们也看到了,就是它。能理解,好,我把它放到这里来。好,我再我再我再去插入一个图片啊,插入一个值。就这样一个字。也就是说,如果我们这样分配一个int类型,那么他在内存里面是这样分配的是吧,非常简单。前面其实也是讲过的,那主要是想给大家通过这个案例引出我们第二种方式来分配一个int的变量,它这样子的NUMBER2直接这样写六一个int,哎,同学们看,如果你这样写的话。
07:15
那么他在内存里面又是怎么分配的呢?来看一下,那就是NUMBER2的类型是什么,NUMBER2的值是什么,NUMBER2的地址是什么?诶大家看一下。那我这改了NUMBER2的类型。NUMBER2的值。Number的地址。那想一想这个是什么意思?大家想一想。如果是number的类型,大家能猜出来是什么类型吗?Number的类型,你这样给他分配,其实分配的类型就是这个类型是一个指针类型。说这个地方应该输出什么呀,同学们,这个地方。我换一行。从这换的。好,如果你这样看的话,你会发现NUMBER2类型,它会输出这个东西,我们先先把它分析一下,就是NUMBER2的类型,这个地方就应该是。
08:08
什么呢?就应该是新int。它是一个指针类型。它是一个指针类型,第二个呢,他说NUMBER2的值,那他想number的值是什么,你们你们能猜出来吗?Number的值是多少?Number的值告诉大家,其实就是它指向的那个空间的地址。这个地方绝对。是一个地址啊,是一个地址,那么这个地址是什么,我现在不知道,我们待会儿看第三一个。还有number本身还有个地址,它是指针,但是它它虽然是指针,但是它本身还有个地址值,这个地址我们也看不到。好,我们输出一下,待会就可以得到结论了。来,我们先运行一把。保存一下。保存,然后我们运行。看效果。看效果。
09:01
好,这个地方因为没有打换行。西安。这地方我们同样也来个西杠,恩。看运行效果。可以看到他说NUMBER2的类型是心,就是指针类型的啊,指向一个int的这个指针,NUMBER2的指是这个,NUMBER2地址是这个,诶这是什么意思,你看如果说我们画一个内存图的话,大家一目而了然,它是这样子的,同学们注意听,如果你不明白的明白的话,就一定要把老师这个图再看明白一点,那哪里呢,就这。注意看老师给大家针对这一段代码画它对应的内存图,这个很重要啊,这样你一看就知道这个六它是怎么回事了。来,往这边挪一挪。往那边稍微挪一下。好,这个代码呢,也可以往下面。我这来看一下啊,没关系,好,我们看这一块这个NUMBER2,然后new一个int附给一个number,他在内存里面是怎么回事呢?它是这样子的,同学们注意听,首先肯定会有一个NUMBER2。
10:07
他也会指向一个空间。注意听,但是这个空间里面的值是一个地址,是什么地址呢?就是它。就是他。能理解吗?就是它,那么本身这一个空间,它也会有一个地址,这个地址就是。这个地址。看到没有好,那也就是说他在内存里面呢,应该是这样存在的。这样存在的粘过来。这样存在。好,那也就是说我们的NUMBER2。其实它是跟这个指向的,它是跟它跟它关联的。关联过后,那这个地址是指向谁呢?这个地址才是真正的指向的一个指。
11:00
它真正指向了一个值,这个值在默认情况下是个零,因为你没有,你现在还没有给它赋值,所以它就是个零。所以说他又跟他指向了。他怎样看?为什么他只用他了呢?因为我们可以推导出来就是这个存放零这个空间的地址,其实就是它能理解吗。就是他这个地方存的这个地址,就是真正存放。零这个数据空间的这个地址好,他们的关系就形成了。那我把这个呢,也给他放到这来。你。能理解好它是这么一个关系,看到没有。也就是说,NUMBER2其实是个指针类型,它它指它是个指针类型,它的类,它的值是一个地址,但是它指向的这个地址指向的是一个空间,这个空间默认为零,因为你在没有给它赋值的时候,这个NUMBER2就是零。
12:00
那何以为证呢?好,我们来给它打印出来,看是不是零。我们再加一句话。我们再加一句话,就是NUMBER2。这个指针他肯定现在是个指针的啊,它就是个就是个指针,它指针,它指它是一个指针。四指针,它指向的指是指向的指,指向。的值是多少呢?好,我们把它输出来看一下,那你要取出它的指向的值就应该是新number。这地方应该会输出零。这个地方应该会输出零。好,我们来看一下是不是这样子跑一下。我们可以看到,的确他输出了一个零。看到没有,NUMBER2这个指针,它指向的是一个零,那也就是说现在我们这个结论就已经出来了。它的值。是一个这样的地址。对吧,它的值,而number本身的地址呢。
13:03
实际上就是这输出来的。他本身也有个弟子,对不对。好,就是刚才我那个画的图里面描述的那NUMBER2,它本身它指向的number指向的值是多少呢?就是零。就这样子的。好,那我问大家一个问题,如果我们想去修改,我们想去修改NUMBER2指向的这个值,我们应该怎么操作?就这个这个六,他其实也就是说这个六,他做的事情其实挺多的。他比这个做的事情还多,他做了什么事情啊?你看他首先分配了一块空间,装了一个零,然后把这个地址交给了另外一个空间。交给另外一个空间它,然后这个地址再把这个,再把这个地址呢,又交给NUMBER2,那number二指向他,他又指向它。是不是这个就是六做的事情,那我现在问大家,如果我想通过NUMBER2去改变。
14:01
这个里面的值,比如说我想把它改成。100我应该怎么操作。请问其实这个在前面是不是已经讲过了,非常的简单,你只要这么写一下就行了。NUMBER2,因为这个就是取值的运算符。那取值我取出来过后,我就直接给他100,那这样子就意味着通过NUMBER2找到了它指向的值,并且改成了100,也就是说把它改成100了。那这个时候我们再去运行的时候,这边这个值就应该是100,那这个就改成100了,但是这些地址没有发生变化,包括它的类型也没有发生变化,能理解吗?好,我们跑一下。看效果。我们可以看到,你看地址是。这个变100了吧,嗯,这个地方为什么会变化,是因为诶我们看这个有没有变化,Number这个变化是有可能的啊,因为他每次执行要根据实际的空间来分配,这个这个地直是有可能变化的,因为你每次执行的时候,你你你内存情况会发生变化嘛,它不可能说都一一直是这个固定的值,对不对,这个是可以理解的,这个可以理解的好。
15:12
这个值是你指定的这个地址空间是根据系统当时的情况来分配,能理解。所以说是根据地当时内存的情况来分配的啊,所以说这个呢,是根据我说一下啊,这个你是你是没办法控制的,就说NUMBER2本身这个里面这个地址的值,还有它本身空间的地址,那你是无法分配的,这个这个是由系统给你分配的。注意这个地址。这个。地址是系统分配啊,系统分配这个程序员没有办法去指定啊,程序员说我我想给他分配到哪里,那那是不行的啊,那肯定不行。叫系统来分配的,这个下面呢也是一样,也是有系统分配的。OK,好,这是我们讲的六这个内置函数的使用,那么我把它呢,给同学们放到笔记里面来。
16:10
好。我把它整理一下好不好放这。整理到我们的六这个案例里面去。它对应的。这上面这个代码对应的示意图,我们也给大家拿过来,上面代码对应的内存。内存分析图我也给大家放到这里来,加深一个认识,好吧,以后别人再去给你说这个六做了做了哪些事情,包括面试官问你,那你应该很轻松的给他回答上来,对不对?告诉他,诶,这个六其实做了两件事情,第一个他分配一个空间,装了一个数值,然后再分配一个空间,把这个地址放进去,再让这个number指向这个空间,OK,是这样一层一层过来的。好,我把它放好。没问题吧,没问题。
17:00
那下面呢,还有一个make这个啊,后面用的也是非常的多。非常多,这个make呢,也可以分配内存,刚才这个六。六可以是不是可以分配内存,但是它主要是给了个子类型来分配一个内存。当当当时大家可以看到我们写的是int float32,这是可以的,包括structure,呃这个呃,Structure也可以,但是呢,将来我们还有一个操作服叫make,这个make呢,可以分配内存,但主要是给引用类型分配,你比如说channel。啊,Channel这个就是管道,还有呢,Map。还有呢,就是slash,就是切片,但是因为这几个数据类型呢,我们现在还没有讲到,所以说关于make的用法呢,我只能放在后面去讲了,不然的话大家听起来也是一头雾水。只是大家要记住,Make可以用来分配内存,这个地方是要有一个概念的。第二个呢,你要知道make是分配引用类型的内存。
18:04
就OK了,到后边再讲到channel管道map,这个map的时候,再讲切片的时候,我们还会。用make这一个内置的函数来完成好,同学们,那因为这个内置函数呢,我们现在能讲的其实也就主要是这么几个,后边我们用到哪些再讲,比如像靠背。Close open,好,这个时候讲到的时候我们再去用就行了,好,那那各位关于内置函数,我们就先给同学们介绍一下,介绍这里就可以了。
我来说两句