00:00
下面给大家介绍一下。变量的作用域,变量作用域呢,其实在前面我们也陆陆续续的接触过一些了,只是说呢,没有系统的给大家正式的介绍一下。那现在呢,我们正式的把这个变量作用句给大家总结一下,第一个啊,其实也很简单,就是几句话,第一个呢,就是说在函数内声明或者说定义的变量,我们就把它称之为局部变量。作用域仅限于函数内部。注意你这个变量,我不管你是首字母大写的还是小写的你的,只要你是在函数内部声明或者定义的,那么它就是局部变量,能理解这个意思吧?诶,这就是局部变量,那么这块呢,我们来举个例子说明。打开我们的笔记。打开我们笔记,来说一下作用欲的问题。作用于。变量作用于。好的,给他来一个。
01:02
标题是不是相当于说是二号,那么刚才我们讲了一个基本的介绍,基本介绍就是实际上就是几句话,重点就是几句话,第一个需要同学们知道的就是什么是局部变量。所谓局部变量,其实说白了就是在函数内部定义或者是声明的变量就是局部变量,那它的,那它的这个作用域呢,仅限于。汉书雷不?好,这点大家有个印象,那同学们给大家举个例子,打开我们的this code。打开我们Vs code,好,这块我们先把它删掉吧,啊,这块不知道是干什么的,先删掉不要了。保存一下。那我们还是新建一个文件夹,因为它还是属于函数,函数里面的内容嘛,我们新建一个文件夹。这个文件夹呢,我们就把它叫做VAR scope。啊,变量的范围。
02:00
我们新建一个文件,大家注意听main.go。好,前面的前面的这一部分呢,我们还是。还是粘一部分过来。这块。好放在放在这啊,这里面这个不用的先删掉。然后我们写一个函数的主体。主函数。那同学们看到我们看看这个局部变量,它是什么意思呢?它这样子的。比如说我这里有个函数。注意,看到这里有个函数function,就写一个test好不好?也很简单,那在这里面呢,我定了两个变量,比如说一个变量叫number。叫age吧,Age,然后呢,给他了附了一个子十,我还有一个变量name,而且首字母我是大写的,给他一个字符串,叫汤姆。好,完事,那我告诉大家,这个age,这个name,它们的作用域呢,仅限于test这个函数类,如果除了这个函数呢,各位同学,那age和none和和这个name就用不了了。
03:10
尽管你手中的大写也没有用啊,也没有用,就说这两个变量的作用域。Age和name的作用域就只在哪里,就只在。啊,它只在这个test函数内。内部啊,那同学们可以试一下,如果你在这用呢,肯定他是要报错的。他肯定是要报错的。你比如说我们这打印出一句话print,我们把这个age取出来,你看一下能能取出来吗?显然这方直接会告诉你这个age age是没有定义过的。Onend,对不对?好,所以说我们得出一个结论,就是在函数内定义的或者叫声明的变量呢?它的作用率只能在本函数内部。
04:03
在别的地方用不了啊,在别的地方用不了,好,这是我们所说的第一个案例,大家注意一下。把它放过来。注意这句话的结论啊,同学们注意听,就这句话。给它放到这个位置,第一个案例我们就说完了,那第二个呢,我们要说的是全局变量,什么叫全局变量?就是函数外部声明的变量,我们就叫全局变量了,也就说它它如果是在函数外定义的,就叫全局,那么如果如果作用它的作用域在整个包都有效,而且如果首字母是为大写的,则在,则作用于在整个程序都有效,就说你在外面写的其实在整个包。不管你,不管你的字母是首字母是大写的还是小写的,在整个包都已经有效了,如果你的首字母是大写的,那么在整个程序都有效,就说在别的包也也能使用,那么这个呢,其实在前面我们已经接触过了,我们再来看一个案例。
05:04
老规矩,把这一块呢,先放在这块。好,我们来举个案例说明,比方说吧,同学们。比方说我们还以这个为例,还以这个为例,那么说我这里有个变量叫H。我来给大家声明一下,比如说age in等于多少呢?50。我是再来一个大写的各位同学还来一个令是。等于Jack。Jack,那我告诉大家,注意这两个变量,这个age和这个age虽然名字一样,但是实际上他们不同的变量。因为这个是全局的,这个是这个也是全局的,而且告诉大家就说如果你在这定义的一个变量,这个首字母是小写的,那么这个age,这个age在整个包都可以使用,如果这个首字母是大写的呢?那这个name不但在本包可以用,在别的包也可以使用,我们把它放到进来。
06:09
把这科结论放到这,老师。就不再啰嗦了。放这就完事。来吧。注意看这里注意啊,我故意把这个名字写写成一样的,就是让同学们区分一下,注意这个age和这个age可不是同一个啊,因为他们作用率是不一样的。他们的作用力是不一样的,来吧,保存一下。保存一下。注意听讲,来,此时此刻我来用它一下,你看我再用。我在写age。等于H,你看它就不报错了。他就不报错了,我们再来看name,我也取出来。Name取出来,你看他也不会报错,但是我们可以推断出来这个地方的age,大家看这地方它报错的原因是因为他认为你在这个地方定义了两个变量,但是你没有用,是这意思吧?好,我把它也用一下吧。
07:08
Print人这一段我们也输出两句话。好,粘一下就可以了,好吧。来我们看一下,那我问他问同学们一个问题,如果我在运行这个命的时候,这个地方会输出什么内容。这个H是50嘞,还是十。显然这个地方是50。原因我就不解释了,因为你的作用欲是不一样的,这个地方输出是什么?Jack是不是Jack好,这样就OK了。如果你在这调这个test函数,那这个地方应该输出的是十,这个地方输出的是多少呢?汤姆能理解吗?来,朋友们,我们跑一个。我们跑一个打开我们的这个。云文件所在的文件夹chapter,然后是VR scope能理解来。
08:05
输入CMD。我们进入到我们的终端,然后呢,Go。Run,我们刚才写的面点构,抛起来请看。可以看到在这里一个是50,一个是Jack,跟刚才老师分析的是完全一样的,当然了,如果说我们在这里面去调用一下test函数,同学们这个地方输出的就是十和汤姆。好,我们来再跑一下。请看效果。对不对,它是有区分的,看这是十,这是。Come。就区分开来了,而且还有一点啊,同学们,如果你这个这个全局变量这个age你在别的包是用不了的。在别的标这个name呢,在别的包是可以使用的,那么这个案例是不在前面我们这讲过有一个案例跟他很像啊,哪个案例是不是在讲in init函数讲过这个类类似的案例,看还还回忆一下看这个ma,这个ma里面我们是是不是用用到us包里面的age和us包里面的name呢。
09:12
你凭什么可以用,你凭什么可以用这个包包里面的age和他的name呢?原因就是你这个us里边。你这个U里面,你这两个变量是大写的。那你如果小写了各位同学,如果你把这个age小写了各位,那我告诉大家,你在这里面就用不了,用不了这个了,你你即使把这个名字改了,你也用不了,我们试一下。注意看啊,这个你改成小写的了,当然你这改成小写,是不是这也应该改成小写啊。你因为你要初始化嘛,你不能这个这个age在这肯定是可以用的,因为它在同一个文件里面对不对,而这就是说在本包它是可以访问的,那么你因为你把这改成小写的,你看在挎包我们在这地方去用的时候。他会直接告诉你用不了,保存一下。大家注意观察这个特点,看大家有没有报错。
10:03
你看,已然报错了,看看这里,他说,Cannot refer to onport就是不可导入的一个词,什么呢?U里面的age。Age,因为它是小写了,用已经用不了了,但是这个没有报错。这个地方没没错啊,这地方是OK的,这个是OK的,那你要用的话,只能是怎么样呢?你要把它做成一个首字母大写,因为只有首字母大写的这种全局变量,它在本包可以用。而且在其他包也可以使用,类似于public是不在前面已经讲过这个这个东西了,好,我再恢复,我把这个改成了。这个大写对吧,然后我把这张也改成大写。你看这样子再一保存又没错了。保存。你看马上就提示没有错误了。对不对?好这点呢,请同学们引起这个重视啊,就说我们在写代码的时候,一定要把这个搞清楚好,这地方我说到这就可以了,大家看这地方还有什么问题没有,全局变量就这么简单对不对?全局变量就这么简单,我把这个案例呢给大家整理一下。
11:10
OK。整理一下。这是刚才老师讲的全局变量的一个案例。放到笔记里面去。Me比较简单。下面呢,我们再来看还有哪些需要同学们注意的,下一个,如果一个变量是在一个代码块里边,什么叫代码块?比如说for。这个控制语句或者是if控制语句,那么我们就认为这个变量是在代码块,那么这个变量的作用域呢,就只在该代码块生效。出了这个代码块不认了,那这块呢也是同学们需要注意的,因为有些编程语言里面,你在for里for这个地方定义的变量它是可以用的啊,但是在go里面它不允许,那我把这个呢给同学们做一个整理。
12:03
好的,请看案例。请看一个小案例。那还是老规矩了,我们在这儿写一段代码,看这里。看这里,我们这整理一下。如果变量是在一个代码块里面,比如说for或者if,那么这个变量作用域就只在该代码块,比如同学们看,我们写一个for循环。For循环,我这里定义了一个I,我定义一个I,我这样写的啊,同学们。I。小于等于10I加加。这个没毛病吧,这个比较简单。然后呢,我输出I等于多少,这个代码你运行我不运行,大家都知道,肯定是输出零到十,这个没有,这个没有什么疑惑,疑惑的地方,因为比较简单,大家看。是吧,他正确输出这个值,但是同学们注意一个问题,就说你在这个地方相当于定义了一个I。
13:05
看到没有,你这一来,那你注意你在这儿下面你就用不了了。你说哎,老师,我想说说一下,当这个I退出for循环的时候,这个I等于多少,你在这用它是用不了的。为什么用不了?你看这马上报告I没有定义,看效果。On I,为什么?因为你是在这个for这一个代码块里边定义的,或者说声明的,那你出了这个for循环就没用了。没有用了。你看如果说我们在下面再来定义,他也不会报重复的错误,你你比如说我把这个代码再重新复一遍,你看他没有报错。至至少上面这个不报错啊,上面这个不报错,你看他说,诶老师有些在有些同学说,老师你看上面有个I,你不是相当于定义的一个I等于零吗?上面怎么又搞了一个I等于零,他们不是重复定义吗?没有啊。
14:00
因为我刚才讲过很多遍了,这个I,它的作用欲只在这个for。这个代码块,而这个I呢,它这个I出了这个for循环它就没用了,所以说我在这定一个I呢,人家认为是个新的I,能理解吗。OK,就这么简单。当然了,有同学说了,说老师。假设我就希望for代码块里面的变量既可以被for循环使用,也可以被外面的这个输出语句使用,那又怎么办呢?那很简单嘛,你就可以这么干。你可这么干,比如说我vri。In等于零,注意我是相当于把这个I怎么样写在外面,然后这个地方我就不用了。对吧,或者你这样写也可以,你在上面定义一下。你在上面定义一下,然后你在这儿只是一个负值。你看。如果你这样写的话,那相当于说这个for循环里面用的I呢,它是在外面定义的。
15:01
那它这个的这个的作用域呢,就是一个局部变量了,这个就是一个局部变量。它是一个局部变量,大家都知道局部变量是在整个这个函数体有效,那我这个时候再输出这个I就没有问题,那这个I呢,就应该是这个for循环处理完毕过后,这个I等于多少就是多少,你看我再保存没有报错了。这还报错吗?没报错。正确。完全正确,能理解我的意思吧,就是看你的需求,看你的需求OK,好,这是老师讲的,这个就是代码块里面定义一个变量的一个特点,当然嗯,老师这举的例子是for循环的if语句,也是一个道理,我就不再举例子了,好不好,因为这个也也并不难,只是把这个搞清楚一下就行了,因为这一点呢,是跟别的编程语言里面还真是有些区别,所以老师再强调一下。大家看看能不能理解。
16:00
能不能理解啊?不难哈,不难,那各位同学,那我就把这一块的案例呢,也给同学们整理到咱们的笔记里边去。好的。大家看到。我重点强调的就是一个作用域的问题。如果你一定需一定希望说在这个代码块里面的变量呢,我除了在代码块能够用,我在别的地方也可以用,那你可以把这个定到外面去,甚至说我定到外最外面去做一个全局变量也可以。也可以。保存。放好。整理完毕。这就是我们讲的关于变量作用域的。一些这个基本的知识,大家看能能否理解。啊,就是这三句话一定要深刻理解啊,一定要深刻的理解。因为这这块还是非常重要的,如果说我们连作用欲都没有,没有搞明白的话,那你在写代码的时候必然会出大问题。那关于。
17:00
变量作用域的基本介绍,老师先给大家说到这里。
我来说两句