00:00
我们来看一下flag包,用来解析命令行参数,前面的这种方式啊,都同学们看到我们前面呢,用的是这个OS下面的。这个arguments这个切片来获取参数。这个是没有问题的,但是这种方式呢,有些缺点大家有有发现有什么缺点没有,这个缺点就是这样子的,大家看,如果你将来在输出这个再去写这个参数的时候,这个顺序写错了,比如说把汤姆写到后面来了。你写到后面来,那原先这个汤姆的值就跑到第四一个参数去了,这是第一个不太方便的地方,也就是说你这种方式呢,要严格的按照这个参数的顺序来编写,对不对。有点麻烦。而且呢,还有一个问题,因为在实际的开发中,如果同学们用过这个MYSQL,你们用过MYSQL或者其他的数据库的话呢,你们都知道MYSQL在登录的时候,它往往是这样写的杠U。
01:03
Root-P对不对,然后呢,比如说带个密码,比如说123456,然后呢杠H,我连接哪个主机,然后呢,杠什么呢端口,比如说3306你看啊。在很多这个程序里面呢,我们经常会看到这种用法,就是前面是一个应用程序,后边呢,他用一个杠U来指定参数。就说他用前面有一个指定参数的一个标识,后面才数字才是这个参数的值。这种用法在程序里面是经常看到的。那这样子有什么好处呢?这样子好处是在于,如果我用这个指定参数的方式来给这个参数值的话呢,我这个顺序就不受约束了。也就是说你这个杠u root,你可以写在前面,也可以写到屁股后面。因为这个程序在解析命令的时候,它是根据你这个指定的参数来确定你这个到底是什么值,能理解我的意思吧。
02:09
好,那既然如此,在go里面呢,它也支持这种写法,什么呢?用flag包来解析命令行参数,举例说明,前面的方式它是比较原生态的,对解析参数呢,不是特别方便,特别是带有指定参数形式的命令行,你比如说看这个。待会呢,我们要求大家写一段程序是test.exe,然后杠u root,杠PWD,然后呢root等等等等,我要求通过这个指定的参数,就是通过这个U。和这个。这个来获取到我们需要的参数值。明白我的意思吧,就说我希望通过这个指令参数来拿到我后面这个真正的这个参数的值,这种用法呢,它有个好处,它的参数顺序可以随意。
03:02
它的参数顺序可以随意,那么在go里面呢,它是可以支持的,它用什么呢?在flag包里面,它可以支持这种方式就说可以支持我们根据指定参数来获取参数的值,好,我们来看一下它是怎么实现的。来吧。我们来做这么一个案例。Flag。好的,那大家跟上我的思路啊。我们把这个要求给它粘过来。待会儿呢,我们就完成这个案例。待会儿我们就完成这个案例。这个案例呢,是这么设计的。我要求同学们去写一个程序,哎,这个程序呢。他可以在程序内部拿到。User。比如说这个U是什什么?密码是什么,H是什么?端口是什么?通过这个指令参数来获取参数的值,好,我们来代码实现。
04:03
代码实现,那么在讲代码实现之前呢,我先我先给大家介绍一下这个flag包,大家打开文档。打开文档过后呢,我们点一下flag。大家看这里,Flag包呢,实现了命令行参数的解析。实现了命令行参数的解析,它这里面有几个比较重要的方法,我我给大家说一下。大家看这里有这么几个方法。一个方法。就是这个。VR。还有一个方法呢,就是TVR,我找一下在哪里,在这。这两个方法用的比较多,那么我们随便的点一个啊,点开一个看一下,大家看这里TVR,那么它的第一个参数。是一个引用类型。就说你呢,把一个值给我传进去,用引用的方式传进去,我待会儿就把这个参数。指定参数的值给它放进去,第二个参数就是第二个参数是什么呢?注意这个地方,这个地方现在老师高亮的这第二个位置填的就是这个值。
05:12
填的就是这个字。U或者密码或者H,就是指定你要获取哪一个指定参数的值,后面这个value呢,是一个默认值。就是说如果他没有钱,没有给值,你这儿可以给一个默认值,能理解我的意思吧,大家看这里名称。名称。默认值这个是。这个usage呢,是他的一个说明。是大的一个说明好,多说无益,我我像这样讲了过后呢,同学们肯定也是不知道老师在说什么,我们直接上案例。我们直接给他举例说明,来吧,看我们的代码说明。老规矩,我们新建一个文件夹。好,叫叫flag吧。Flag。
06:00
Flag DEMO好吧,那在这里呢,我新建一个文件叫may点勾。问题,那我打个包包package。朱宝。Theport。对吧,Format,然后呢,写一个主函数。好,我们现在开始玩儿了啊。现在开始玩了,首先呢,我们要引入一个flag包。首先要引入一个flag包,好,首先我先定义,我先定义,呃,几个变量几个变量。几个变量?用于。用于保存或者要用用于接收都可以用于接收,接收这个输入的参数。命令行用用于接收命令行的这个参数值。开始了啊。开始了,呃,那现在我们看一下,根据这个案例而言呢,它将来会有几个参数呢?一个两个三个四个好,前三个是字符串。
07:09
第四一个是一个int类型,是个端口,好,那我就这样定义了。那我就这样定义啊,第一个VR是user是一个字符串。没问题吧,VR然后呢,它还有一个密码。是一个字符串,它还有一个什么呀,它还有一个主机host是个字符串。最后呢,它有个端口port是一个类型,好,我先把这四个变量定义好。那定义好过后呢,我们就来接收了啊,用哪个呢?Flag包包里面有一个十寸VR。里面传四个参数,第一个参数。Userr用引用传进去,也就是说将来这个地方就是userr呢,就是在接收这个值的。好,那么我接收哪一个值呢?接收的是这个参数的值。
08:04
这个哎,我我看一下这边啊,同学们看一下接收的是这个U,好,那我就输一个U。默认值呢,给个空。好,这边写一句话啊,这个是获取,就是什么呢?就是呃,用户名,用户名默认为空,默认为空。那大家现在看看能不能理解了,我再说一个说做做一个说明啊。这个有点。就是。就是接收或者保存。就是用来接收用户。用户。用户命令行。命令。命令行中输入的。输入的这个U杠,U-U后面的。后面的这个参数值。
09:01
好,那当然看这个就更好理解了,这个U代表什么呢?就是。就是这个杠U这个参数。指定参数啊,指定参数。好,再来看这个地方,这个地方空呢,就是代表默认值,就是说如果它没有填默认值为这个。这个是默认值,什么意思呢?就是说假设我们在命令行里面,我们没有给他传这个U,指定这个参数,那么这个U呢,这个U的默认就是,呃,就是一个空值,能理解吧,默认值好,后面这个。后面这个呢,就是对这一个字段或者这个参数的一个说明。他就是个说明完事了。好,其他有意思类推了,老师就不一个写了啊,那密码。那么密码呢?到时我们按什么指定的参数来做的呢?大家看这里密码是PWD。那我待会儿呢,指定的是PWD。那我这一旦写写写死了你,你在传这个指定参数的时候就不能乱写了啊,你就必须写杠PWD了,密码也是空啊,默认为空就是密码。
10:10
来还有一个主机,我们看主机我们是怎么填的。打开这里,它的主机是H,好,它指定是按H来获取的,没问题,我这也写H。Host。那么默认呢?我们写个主机吧,Localhot,这是主机名。主机默认为local host。再说一遍,默认是什么意思?就是说如果你没给我填,没有给我写,这个指没有指定这个参数,那么这个host默认,这个host默认就是local host。能理解我的意思吧,最后还有一个flag端口,那么这个端口呢,因为是int类型,所以说我们用的是in VR。能理解好,这方还是一样的泡。然后呢,它指定的参数我们看一下。
11:00
他这里实际上是TT。QT好的那端口默认我们假设是3306。啊,假设3306,那这个就是端口号。端口号默认默认为3306好,写完了,他写完过后,同学们啊,注意听,还有一个非常重要的动作,这里有一个非常重要的操作,就是转换。你必须要调用这个方法啊,必须调用这个方法。必须去调用。打开通话。那怎么写呢?就是flag.pass pass。这个很重要,我们来看看这个函数是干什么的,打开我们的文档。点一下flag。好,点一下覆盖flag,我们下面看,里面有个PAR。
12:02
往下捞,Ear。往下走。看这里点一下。看这里。Pass呢,它是。从这个数组里面解析注册的flag。必须在所有flag都注册好后而未访问其值前执行,那也就是说这个呢,必须进行转换,才能真正的把这个切片里面的这些值转换成功。再给你转回来啊,说这个pass必须有,不然拿不到值,好最后我们输出结果。输出这个结果看一下flag,我们走一下啊。F。我就直接给大家演示了啊,U等于百分V。好,密码等于百分v host等于百分V,好。Part等于百分之好,换一行。那么我们这边有哪些词呢?User。密码、host和port。
13:02
写完了,好,同学们,我们来用一下,看看能不能拿到这个这些值啊,保存一下。看代码有没有问题,好,这里有个问题,我们看哪里错了。OK啊,因为它是整数,所以说这个地方应该不要用括起来了。因为它是一个int型嘛,所以你括起来没就没道理了。好,我们来玩一把。看看能不能跑起来。好,CD点点CD的ARGUMENTS02。对吧,诶没有点CD到。Flag flag DEMO。然后呢,Go run。我们先编一个build-o test。点exe对随机编译,对这个main点构。好编译,编译过后呢,我们会得到一个test.txt好,来玩一把。
14:00
根据我们刚才指定的参数,U root杠密码。PWD,比如密码呢,我们写的是123456,没问题吧,当然我们还有一个主机,主机我们看是用H,我主机写个。IP地址啊,比如说127.0.0.5。点五好,最后还有一个端口part,那么我给他端口来个8080回车。好,同学们,可以看到,此时此刻,我们拿到所有的纸,而且都是正确的。看到没有,那有些同学说了,你这个有什么好处呢?好处是在于我这个顺序可以乱写,比如说我把这个杠u root,我就不写到这,我偏偏要写到最后。这个也没有任何影响,比如说我故意换一个名字啊,比如说汤姆。杰,Jerry Jack回撤,你看你把这个杠U这个指定参数呢,写到最后,你发现它也能解解析出来。对吧,那同样说老师你还有默认值给我们玩一下,假设这个端口我没有给他传这个值,那么这时因为你没有传这个指定port的这个参数值,那么它会启用默认值,大家还记不记得我的默认值写的多少?
15:15
3306。那也就是说,如果你没有传的话呢,因为你没有传port,那么这个portt就是3306对不对,看果然如此说的这种用法呢,非常的灵活。非常灵活,在我们实际开发中会经常使用到这个flag包来解析我们的命令行参数,所以这个呢,大家必须掌握好吧。必须掌握,也也比较简单,也比较简单,但是呢,必须给大家点出来,好了,同学们,我把这段呢给大家做一个板书。很重要啊,大家一定要认真认真把它掌握了。好的。我来把它截取一下。截取到第23行。截取到第23行,整理一下。好,23号截继续截取。
16:03
20行下面呢,就是24行对不对。截取一下。没问题。把它保存到我们的这个笔记里面去,大家一目而了然,好,同学们,那关于使用flag包来解析命令行参数呢,我们就给大家介绍这里,这个大家一定要掌握啊。以后在我们用命令行。来指定参数的时候,用的特别的多,用的特别的多,OK啊好,这块我们就先聊到这里。
我来说两句