00:02
那现在呢?我们来看一下包的概念。嗯,刚才我们讲了这个函数啊,这个函数很好,它可以解决什么问题呢?它可以解决我们代码复用性的问题,而且呢,也利于我们代码的维护,但是当我们我们用完函,用了函数过后呢,又带来一个新的问题,什么问题呢?大家想一想。旁的先不说,旁的先不说,大家想一想啊,我们在这个men.go里面,我们写了一个方法对不对,这是没有问题的,但是大家想一想,如果说这地方写一个函数是可以的,那就意味着将来我可以写很多函数。大家想,我们在,我们能不能够把所有函数都写在一个地方呢?大家想这个问题,比如说今天我写那个。开了一,那我接着再写函数,再写函数,函数越来越多,都堆在这一个面点构里面,这合适吗?这肯定不合适,比如说我画一个示意图来描述这个问题。大家看现在的情况是这样子的,在这里有一个面点go。
01:04
may.go这个文件,这个文件里面呢,我们有一个刚才写了一个函数叫。对吧,这样子我写到这儿,然后这里面呢,我们有一个组的主方法,要组函数。在这个主函数呢,我们去怎么样,我们去调用了,我们调用了什么呢?看了。Carte。这个函数没问题吧,这没问题,但是你你们想没想过一个问题。我们会不会有这样一个需求,什么需求就是这有一个函数,我们接着再写。一个函数,我们再写函数,好,问题就来了。我们能把所有的函数。都定义到闷点购里面吗。当然有些同学老师我就全部写到里面不行吗?从理论上来说这是可以的,再说一遍啊,从理论上来说是可以的,但是你想一想,我们一个大项目,难道所有的我们一个大项目里面函数可能有成百上千,你都把这么多文件都写到函数,都写到一个文件里面,你觉得合适吗?
02:11
显然,这是不合适的。对不对?这显然不合适,于是乎我们就提出一个新的概念,新提出一个新的问题,怎么解决一个什么问题呢?就是如何把这些函数。写到别的地方,然后呢,我再调用。是不是顺理成章就出了问题。也就是说。假如我这里。有一个新的文件,比如说这个文件叫uts.go那这个文件干什么呢?就是专门用来。用语用语。变定义,定义工具函数的定义函数让让其他文件来调用的。有没有这种可能性?有这种可能性吧,也就是说我们想实现怎么一个效果呢?就说你的函数啊,有很多函数,你呀,就别全部写在men顶勾里面去了,你专门写一个文件,或者写很多文件,比如说我把这个。
03:09
函数啪减去掉放这听我讲,我讲把它剪放这儿,然后呢,我在这个地方,我在main.main这个方法里边。我要干什么呢?我想去用它,我想去用它。怎么样,我去用它。我想用它,我想用它的时候,我怎么办呢?诶,我引入只要有一种它支持一种方式,就是引入什么呢?UT。UT的u is.go的什么呢?这个开了函数就可以了,只要他提供这样一种机制,就说我想用谁,我就把它引到我的这个相应的。这个文件里面我就用它就行了。好,告诉大家,这种需求肯定是很多的。这种需求肯定很多,你刚才讲了嘛,我们不可以把所有的函数都放在main点构,这是不合理的。
04:00
对不对,所以说我们可以把一些函数,常用的函数呢,写在一个专门的文件里面去,甚至可以写在其他文件,不是说只写在这一个啊,可能我们还有别的文件,比如说呃,假设我们把呃把些常用的函数。我把些常用的函数写到这,写到这个UTS点勾里面,我们也可以同时干什么呢?诶,我们还可以再写一个文件吗?我们还可以再写一个文件啊,我是个亿,大家理解我的意思啊,假设我们这还有一个文件。这个文件呢,专门用来对数据库的操作,叫DB。点购,那这里面我又专门定义什么呢?诶,咱们专门定义对数据库操作的数据库。操作的什么样函数,哎,那这样就好办了,我就相当于说分门别类的把各个函数写在对应的文件里面,我要用怎么办呢?很简单,如果我要在闷点go里面用UTS里面的。这个这个。开了C函数,我引入这个,如果我想用DB里面的假设,我就有这个函数,叫做叫做A的一个数据data假设啊,我不写那么多了,这有个函数。
05:12
对不对,像这个函数我怎么办呢?诶,我先在这儿用,我又引入。我又引入。引入什么呢?哎,我要引入DB.go的哪个函数呢?A这个I的函数。哎,我用了过后,那我已引入过后呢,那我在这里,我除了可以调用开了C函数,我还可以调用。我还可以调用什么呢?我还可以调用I的这函数多好啊。也就是说,我把引进来就行了。那你把瘾进了。引进来就行,这个这个线应该放到这上面去啊。这样就好,那么告诉大家,这个时候就会用到一个新的知识点,叫什么呢?第一个我叫做包。
06:00
包就出来,包的作用就是可以达到这种效果,干什么呢?可以让我们分门别类的把各个函数,或者把我们需要的一些功能分散到不同的文件里面去,然后再用的时候直接引入就可以了。多好,这个就是我们包的一个引出,那么再看一下幻灯片,我们再念一下,在实际开发中,我们往往需要在不同的文件中去调用其他文件定义的函数。比如在men点构中,我们去使用UTSGO里面的函数如何实现?就是刚才老师讲的这个东西。这个案例,比如说uts,除了有这个开了U函数,它当然它还可以定义很多其他函数啊。比如说function,比如说我们还有一个函数叫做C哈。谁谁OK或者谁hello,对不对,当然这边还可以有很多其他函数,比如说除了加加一个函数,比如说我们还可以get一个连接。等等啊,当然我就十个亿,那当然我要用谁,我就引他能理解,那就说我们刚才提的第一个需求就是如何实现,这个地方就会用到包。
07:04
待会我再讲这个包的本质啊,那么第二个还有这个包还有一个什么用处呢?就是两个程序员共同开发一个购项目,这是有可能的,因为我们项目将来很大,你不可能是一个人去写吧。张三李四都有可能去写。假设有一个程序员叫小明,他希望定义一个函数,叫大写的C。小强呢,也想定义这个函数,两个程序员还打架怎么办,对不对?所大家大家有可能去定义一个相同的函数名,这是可能的,但是大家都知道,我们在同一个文件里面是不可以定义相同的函数名的,如果你有相同函数名,它肯定就报错,因为叫重复定义,你看比如说我们在main里面,我们再去写一个这样的函数,它是绝对给你报错的。比如说啊,我就四个亿。我写一个特别简单的,还叫开了,我什么都不写,这里面是个空的,当我一保存这地方立马报错。大家看这。
08:02
看这里。啊,大家看已经报错了,他说,CL calculator declared in this block。什么意思,就说你这已经声明过了,声明过你还再去申明一个,他不允许。到时候,在这个梦点歌的第六行。是不是这一行声明过了,因此这是不允许的?那就是刚才老师说的这个问题,什么问题呢?如果两个程序员都想定义同一个文件,呃,都同一个函数名,这个时候也会出问题,那同样刚才这个机制又能解决它怎么样?假设我们这个uts是小明写的。假设DB点够是小强写的,那你放心大胆写了,因为你已经不在同一个文件里面了,或者说不在同一个包里面了,好,这个地方你可以写,你这儿可以叫C,我这地方也可以写个函数。也可以看书。算了,开了。那怎么样才能实现这个效果呢?就是你这有个叫CL,我也叫CL,它怎么区分呢,还是用我们的包。
09:06
明白,好同学们,通过这两个东西呢,我们就已经可以引出包的必要性了,对不对?好同学们来看老师讲的这两个需求都会用到这个包。包才能解决的问题。下面至少让大家体会到包的作用是什么,第一个包的作用可以让我们分门别类的,就是说在不同的包下面建不同的文件来,来把我们的函数放到这个对应的文件里面去,然后进行调用,这是第一个好处。第二个我们这个包呢,还可以进行项目的管理。还可以进行项目的管理,比如说我让小明建一个包,让小强建一个包,然后呢,个人在自己的包下面去写自己的东西,这样呢他也不冲突。理解,OK,这就是需求,就是为什么需要包引起,引出来了,来,把笔记补一补。好,同学们,我们引出了一个包的重要概念。对吧。包。
10:02
八。的需求,关于啊,就是使用包的引出,就是我们引出这个包的包的必要性。包的因素。来给他写一个标题二,那刚才呢,老师整理了啊,整理了这么这么两个需求,对不对,两个需求OK。放到这里来。第一个就是我们需要在不同的文件里面去写自己的函数并调用。对吧,我这里也画出了一个示意图。这个示意图给同学们拿回来看一下,当然为了实现这个效果呢,这个uts和DB要在不同的包啊,要在不同包后面,我们会说这个东西,比如说打个比方,我在这这个UTS放到一个包,这个放到另外一个包下面去,怎么实现待会再说,好吧,怎么实现待会再说。我把这个稍微的。往这边放小一点,这边往这边挪一挪啊,这样看起来会舒服一点。假设这是一个包。假设我们叫utrs包,对不对?叫,这又是一个包,叫什么呢?叫DB包。
11:05
诶,这样就可以区分了,至于怎么形成这个包,待会再说啊,待会再再说,好,这是两个概念,那么我们接着再来看一下它的本质。大家看,讲到这儿呢,我们必须要说一下包的原理了。包的本质就是创建不同的文件夹来存放程序文件。画图说明一下这个原理。包的本质再说一遍,包的本质就是创建不同的文件夹。他创建不同的文件夹,然后呢来存放程序文件。说老师你这个能说的再具体一点吗?没问题,我可以这样讲。比如说待会儿呢,我们要实现这个效果,就会这样做,这个man它是在一个文件夹下面。这个包,这个u tr包呢,我们会这样建,打个比方啊,待会儿呢,我们会把这个u tr降到这个包,呃,待会儿你们可以看到这个效果,看到这个效果,比如说我这把这个包放在哪里呢,就是将。
12:00
将这个uts.go放在。放在比如说我们整个项目的目录结构是这样子的。我我举个例子啊,我举个例子,比如说待会儿呢,我们要实现这个效果,可以这样做。可以怎么做呢?大家看我们打开打开这一个我们go project里面的源代码,大家看。注意听听我说啊,我先四个亿,我四个亿,比如比如我这有个项目,注意听我听我说。比如我这个项目叫做OA项目。OA项目注意听OA项目好,OA项目里边呢,我我四个亿啊,在在听老师说这个含义啊,这有一个面包。OK,然后这里面呢,注意听我这儿有一个面点。注意听讲啊,may.go文件。好的。再看。这是我们OA下边。这是我们OA下边。这个src下面有一个。
13:01
OA项目,OA项目下面已经有个main文件了,这个main下面呢,有个man点够好,那么我怎么去实现这种效果呢?在勾浪里面它是这样规定的,你不同的文件放在不同的包下面就可以,那这个包的本质是什么呢?包的本质就是这样子的,我在OA下面再建一个包,听我说。比如说叫UTLS这个包,这个包包下面呢,来创建我们的uts点购文件,当然它也可以别的文件啊。Us顶购理解大家看到没有好。如果说我们要建另外一个包包,比如说刚才在这图画的叫DB包,那DB包呢,我怎么办呢?诶我再建一个DB。DB。在DB这个文件夹下面呢,我再去建DB点构。诶,大家看到没有。DB点购。这样子就把我们的文件分开了。
14:01
大家看这个结构,这是项目,项目下面有DB。文件,这个DB文件呢,就在这个。这个DB点够呢,就在DB这个包包下面。所以说包的本质其实就是文件,Men呢是在men.go就是在main这个包下面,这个包呢,对应一个文件夹,这个UTS呢,诶各位同学看它呢也有个文件,这个文件呢,就是在UTS这个包厢里。理解这个意思吗?说白了,你可以这样理解,就是说我们一个包往往对应一个文件夹,而这个文件夹下面呢,就有我们的文件,通过这种方式和这种机制,可以实现刚才我们的这种效果。能理解吧,好,当然它还有很多细节,细节呢,我们在讲后面的时候会逐一给大家展现出来。但是大家一定要知道,包的本质就是一个文件夹。OK,好,那现在呢,我们把这个本质已经大致的给大家说了一下来,朋友们,我把这个放到这里来,包的引出说了,包的引出说了,然后呢,我们刚才又说了一下包的原理图,我们把这个包的原理图呢,给大家放到笔记里面来整理一下。
15:05
来吧。哎,OK,包的原理图,OK。好包的引出,那这个地方我们看应该给一个什么样的标号。好,包的原地图,包的原理图给一个,好,这个是快速入门包的引出,OK,那就包的原地图,我们也给他来一个标题,标题二吧,可以,问题不大啊,包的原理图放到这。好,那么刚才我们讲了包的原理,图的一个介绍,还有一个说明,把这个图呢,也给大家放过来,让大家理解的更加的深刻了,好这我画了一个示意图,对不对?大家看这个目录结构。主要看这个目录结构。好,我把这个公路结构给大家整一下啊。把这个放到这儿。我就在上面,再上面来一点。注意看这个结构图,待会我就会按这种方式来进行进行处理。
16:01
看这里。这就是我们的一个项目的一个结构里面呢,每个文件夹下面,诶,你看这。就有自,诶这个画错了,这个地方就有我们的文件,每个包包下面有自己文件就分开了。这是他的一个项目的一个图,同时呢,我还讲了一个示意图,对不对,我还讲了一个示意图,把这个示意图我们也放到笔记里面去,就这个图。这个图呢,就是uts是在这个包包下面。消息。对不对,那这个DBDB文件将什么呢?这样子啊将。将DBDB点勾放在放在DB包下。哎,这样就分开了,那这个时候就能实现我们刚才所说的这种管理机制啊,这样管理机制好,我把它呢,也给大家放过来,示意图已经有了,对不对。示意图已经有了,来吧,有了示意图,下面我们该干什么事情大家知道了吧,我们就来用了。
17:04
有了这个原理来做支撑。大家心里面就不会觉得好像很迷茫了,对不对,好同学们,那么这个时候呢,我们就把包的一个基本介绍,包括它的需求和它的包的原理就说完了,下边呢,自然就是我们包的应用,就是怎么来实现刚才的效果,待会儿呢,我们就有案例说话。好,关于包的原理和基本介绍,我们先说到这儿,下面呢再说包的使用。
我来说两句