00:00
那现在呢,我们接着来看for循环注意事项和细节说明的最后一个就是go浪,它还有一种叫for range的,For range的一种方式呢,也可以来进行字符串或者是数组的遍历,那问题来了,有些同学就说了,老师数组我们还没有学对不对?所以说我我这呢已经为大家考虑到了数组的便利,我们放到讲数组的时候再为大家讲解,这里呢,我就简单的说一下我们,嗯,遍历字符串是怎么完成的数组我这不提啊,我只是说怎么去遍历一个字符串,遍历字符串呢,又有两种方式,一种方式就是我们传统的方式,最传统的方式,第二种方式呢,就是用for range的方式来进行字符传的便利,当然for呢也可以对数组进行便利,能理解,我们先来看一下这个地方的使用细节来吧。我把这个第四个细节先放到这里,我们来举些案例来进行说明和了解。
01:02
看一个案例啊,我们来看一下案例说明如何便利我们的字符串方式一。先来看一个方式一。字符串。字符串遍历方式一,我们来整理一下。比方说。我们先用第一种方式,第一种方式就是我们所说的传统方式。传统方式来吧。写到这里来。同学们看,现在呢,我们把这个遍历的语法写到这里来,字符串遍历方式一。比方说现在呢,我有一个字符串VR。是准是字符串等于负一个值啊,比如说hello word,这个没没问题吧,很简单,Hello word,然后呢,我用传统方式先便利一把four。I,现在呢,我I。等于一注意啊,这个虽然你上面定义定义了一个I,我问大家我在上面定定义了一个I对不对。
02:03
是不是写了一个I啊,生命的一个I,我在这再声明,I,大家觉得允不允许?允不允许肯定是允许的,因为我们讲过for循环在这个地方声明的变量,它的作用域只在当前这个for结构体有效,出了就没有用了。所以说我在这再定一个I,跟上面是不不打架的,因为这地方的I和上面的I不是同一个,能理解吗?好,来吧,I小于多少呢?小于N,我把字符串的长度计算出来,然后I加加。然后我就开始循环输出。一个输出好不好,那我们来输出一下。直接用按字符串的形式输出就可以了。等于什么呢?是最。I写完。因为你每取出一个吗,你这个I不是代表是第几个吗?啊,那我这边从零开始取。
03:00
是不是I从零开始取,I只要小于这个长度我们就可以取了,大家对这块可能还有点不理解,你先听听一耳朵啊,这方就是用到了,用到了一个下标。如果大家。如如果大家有点听不懂的话,你先暂时的忍耐一下,说了后面会讲,其实这个也很简单,虽然说大家没有没有讲过这种方式呢,你大致也也能猜的出来,这个就是访问这个字符串的第几个字符,因为你第它是这样子的,它是H,就对应下标为零的零的这个这个这个元素。那么如果是一呢?诶,这个如果这个I等于一,就是访问的E,如果I为二呢,访问的就是。L就是它从零开始编号,明白吧,它这个是从零开始编号的,好,我们来跑一跑吧,先体验一下,跑起来走着我们可以看到这时他输出这些字了,但是为什么没有按这个输出呢?因为我们要格式化。
04:00
按格式化输出对不对?Print f,好,为了好看,我来一个换行。没问题吧?跑起来,请看效果。这时你看输出的hello逗号,Word是不是就全部编辑出来了?这是我们的传统便利方式,第一种方式,那么还有第二种方式呢?也给大家演示一下,第二种方式就是用foreign方式。什么方式啊?就是用for方式来遍历一个字符串数组。没问题吧,For,那这个时候怎么遍历呢?大家看我的语法非常简单,它是这样写的,我们还写一个字符串,然后呢,它是这样的,这一个index。这有一个value,这个地方显示定义冒号等,就相当于是定义这两个变量是不是,然后呢,Range range谁十寸好,大致就这么个意思,我把这个给他演示一下,大家一看就明白了,Index,这是下标。逗号,然后呢,Value。
05:02
找range谁呀,String写完看大家看,这就是for range这种结构,那有些同学老师这是什么意思,我都看不懂。你看不懂,老师给大家解释一下来吧,打印出来一下。打印出来一下,我分别输出index等于,其实这个index返回的就是它的下标对吧,我输出D,另外呢,Value等于就是一个字符。就是这个字符了。我也把它按照这个输出来,首先index来value,我们先输出再说吧,好不好,我们先输出来过后再说,然后呢,我再来一个字符串。字符串上面是哈,我把这个改一下,思寸重新赋一个值,比如说我们这个叫做。ABCOK。ABCOK,没问题吧,也就是说这个时候它遍历完了过后,我把这个十寸改成了ABCOK,能理解吗?跑一个。
06:02
这样子,为了好看,我来几个换行。来,跟上思路。跑起来,请看效果。我们跑起来过后呢,我们发现,诶你看这输完了过后。哦,这种都没有。不好说啊,这是不是往打一个。换行了吧,没看换行看起来不舒服,看效果。咱们看。下标为零,就说你第一次遍历出来的时候注意看啊。从这个十寸里面第一次取出来,第一个就是A是不是A,看这。你第一个取的是不是就A。没问题吧,第二个取的是不是B,第三个C类推,最后把K取出来了,那么在取的时候这个index怎么取呢?这个index它就是按顺序给你编的,看第一个是零。第二个是一一随推,那什么意思呢?其实这个地方大家想一想,其实它就相当于说它是这样一个意思,它从这个十寸这个字符串里面怎么取呢?它把A第一个字符交给value。
07:13
然后呢,他认为这个A是。A对应的这个下标等于零等于字符串的零。能理解吗?然后再进行第二次便利,第二次这个取的时候呢,把这个B交给valueb呢,他认为下边是一就这么对应的。你看这地方其实已经写的很清楚了,是不是很清楚了,所以说是这样子的,很很好理解,很好理解,如果说我画的再明白一点,画一个图的话,大家大家可能看得更清楚,我再画一个图,它是这样子的,注意听啊,我就画一次假设刚才老师的这个字符串。是这样子,一个字符串。那么这个支付存在内存里面,它会怎么存放呢?它会这么存放?好A。
08:01
B。C。是不是,然后零啊波浪号。The o。然后K。K,也就是说他在内存里面呢,存的时候,其实呢,它都有一个小空间,你可以认为它一个小空间。小房间。对吧,一个小房间,那么每一个小房间呢,它有个编号,比如说这个编号是零,这个编号是一,这样是不是大家看起来就更清楚了,这个编号为二,这个编号为三,这个编号为四,这个编号为五。就说这上面是我们的小房间。标准红色下面呢是每个小房间的一个编号零,从零开始编号。也就是说,假设我这样写是最。二那十寸二其实就相当于找到十寸里面第二个小房间对应的这个值,那这个时候这个地方,这个地方应该是等于多少呢?其实就是等于C。能理解了吗?所以他这个这个其实也并不并不难理解,就是他每次取的时候,他就从时寸里面一个一个的把字符取出来,分别交给index和value value呢就是这里面具体的值,而这个index取的是什么呢?就是你的刚才老师画的这个小房间的编号是一个数字。
09:21
这样是不是大家就更清晰了呀?好,就这么回事啊,非常的简单,好,这是我们的两种方式,第一种方式,传统方式,第二种方式,用for的方式来便利字符串。当然了,数组怎么遍历我现在不讲了,为什么?因为数组同学们还没学,我讲了过后大家会听的懵懵懵懵懂懂的。好,我先把这块呢拿到笔记里面来。字符串的第一种方式和第二种方式分别截取视频。第一种方式,第二种方式就不是传统方式了,用的是什么呀?用的是一个结构for range。For这种方式对不对?那我把代码呢写到这里来。
10:02
走一个。这是我们的第一种方式。看懂了。这是第一种方式,我先把它放到这里来,紧接着呢,我们又讲了第二一种方式,也把它放到笔记里面来。第二种方式是for的方式,没问题吧?好的。来放这就OK,那现在呢,我来分析一下上面代码的细节,做一个了解,这两种写法没有什么,没有任何毛病,但是有一个细节讨论。就是上面代码的细节讨论,来聊聊这个细节。我们最怕的就是细节,但是呢,最重要的往往也是细节。注意同学们看代码,假设我在这边写了一个北京两个字,问题就麻烦了。同学们看我写那个北京两个字,我本身想这样便利,诶,先把H取出来,就是按顺序把每个字符取出来嘛,这个也没什么毛病,但是我一运行你会发现很奇怪的事情发生了。
11:06
同学们看效果,诶,你们有没有发现,当它把上面这个叹号这取出来过后。结果再取的时候,没有把这个北京的北取出来,而是取了一堆那乱码。不是北,也不是京,这是为什么呢?如果面试官问到你这是为什么呢?我告诉大家原因。我告诉大家原因,如果说你的字符串里面有中文。那么对不起,你的这种传统写法,它默认是按字节来进行便利的,也就是说它是按一个字节一个字节取的。而我们的。勾浪编码是UTUTF8编码,一个汉字占三个字节,因此就会出现乱码,所以说我把这个地方写到这里,然后我们再说解决方案。我们再说解决方案啊,细节就是什么呢。
12:01
如果,如果我们的字符串。字符串含有中文,那么那么传统的传统的便利,便利字符串的方式,字符串方式就错了。就是错误的。就是错误会出现,会出现乱码,原因是为什么,我分析一下原因。注意听啊,原因是传统的。传统的便利啊,对对,字符串的,字符串的便利,便利啊,便利是按照按照字节来。来这个统计的来来便利的便利的,这样这样的话。这样的话而而直接说啊,而一个汉字一个汉字在UUTF杠八编码时。编码。
13:01
是什么呢?是对应三个字节。那这样就肯定麻烦了,你想一想,它是一个字节一个字节取的,而你一个汉字呢,刚好对应三个字节,这样子的话,它取一个,就好像我们三个字节组成一个汉字,但是它取其中一个字节,显然这个就出问题了。显然就出问题,原因就是在这里,原因是什么呀?就是传统的对字符的便利,它是按自己来便利的。而我们的汉字呢,又是一个汉字对应三个字节,那显然这次他取相当于说只取了1/3,那肯定要出问题。当然你中文如果是英文和数字,这个没问题的,刚才大家也看到了,确实没问题,汉字就要出问题,怎么解决呢?如何解决?非常简单,非常简单。只需。只需要。将什么呢?将这个我们的四寸。转成转成一个切片润这个切片。
14:01
那问题来了,说老师,这个切片是什么玩意儿?听起来好高大上哦。同学们啊,切片我们会放在数组和切片这讲,因此按理说这地方我就应该不说了,我就点到为止,我就说啊,同学们这帮把它转成切片就可以了,我按照你这样说就可以了,但是呢,没有关系,虽然说切片我还没讲,那么我让大家体验一下,我也不做过多解释啊,我就是把这个方法给你解决了,让你体验一下就可以了。后面切片的详细介绍我也放到后面,有一个大量的,至少要讲一个小时到两个小时,关于切片,好吧,就先体验一把。我不做详细解释,体验一把,来给大家解决一下啊,让大家心里面感觉很爽,来看我怎么解决,非常的简单。非常简单。那么我只需要这样处理。这段代码我把这个注注销了。怎么解决呢,这样做。这样做,我把它强制的转换一下尺寸。
15:04
等于。R。然后把这个尺寸转,也就是说。我把大家看这个意思啊,这个是一个新的类型叫切片,我把什么呢?把这个四寸转成了rain这种数据类型的切片,这样就可以了。即就是二,就是八是罪。转成了,转成了这个数据类型,这是切片。OK,那这个时候你再用。就马上没问题,跑起来吧。跑起来。好,我看代码是有问题是吧,看这里有问题在什么地方。RA type a哦,同学们啊,这个数据类型的问题,那这样子我们把它稍微的改进一下,就是,呃,我在这呢,把它改进成什么呢?非常简单啊,非常简单,我把它稍微的微微的改进一下,就能解决这个问题。
16:02
嗯,怎么解决呢?大家看我的代码这样子,我们因为这个地方的问题是什么呀,因为你这个十寸呢,它本身就是十寸,它的类型是一个十寸字符串,而你是这个类型,你转它本身就不统一,他肯定不行的,所以说说白了这样写肯定就是很搞笑的啊,咱们不能这么这么干,怎么干呢?这样子我们用新的变量来接收就行了,比如说用十寸二。这样就不就就完事了吗?是不是很简单一个思路啊,但是下面呢,是不是也要改成这个,能理解吗?如我改了,我都改保存一下代码O了。是不是没问题了呀,就刚才我的错误是把一个十寸转成这种数据类型过后再交给四寸,那这个不就很矛盾吗?所以说我用一个新的。这个串来接收,这个时候我们再来跑一把。好起来,请看效果。同学们可以看到,诶,北京两个字就已经遍历出来了。
17:00
北京两个字就编辑出来了,好,代码解决完毕。这地方就让大家体验了一把啊,详细的内容我放到后边再具体介绍。这是一个,那有些同学又说了,说老师诶。那你有些同学就要问到说老师,那你这种for的方式如果有汉字会怎么样呢?来,我们也来试一把,我也加一个叫做上海。好了,同学们看,这时我用十寸,还是这里面带的有汉字,我来遍历,我遍历的时候,我们看这个时候它会不会出现乱码呢?各位同学请看效果。我们一执行请看效果,诶,我们发现它没出现乱码,诶你看这里有点意思吧。第六一个是上海。哎,下一个是第一个是上,下一个是海,诶注意看到他跳了。这是六,它直接就跳到九了,为什么?就是因为一个上这个汉字它占三个字节,那就是说它应该占的是第六个,第七个,第八个字节。
18:04
因为一个汉字占三个字节嘛,然后这到了下一个就是第九个字节刚好把上取出来,也就是说我们for这种方式啊,它很智能,它其实是按照字符的方式来进行编利的,就这一句话管用,明白了吗?就说我们的for它是按字节方式来进行编利的,因此如果你这个用foreign来进行编辑这个汉,这个字符串里面有汉字也no problem就没问题,所以我们推荐使用这种方式,能理解好,我把这个细节写到这里来。最近。细节二再说一下啊,就是什么呢。这个是传统的方式,第一个我们说的是第二个啊,就是对于对于for这种方式而言。便利。便利。方式而言。而言,默认是使用了使用的是字符的方式遍历。
19:02
也就是说按照是按照什么呢?是按照。按照字符的方式编译。方式遍历OK,因此因此如果有中文,如果字符串有中文,字符串有中文,有中文也OK,也是正确的,也是OK的,也是OK的,好,这是我们两个方式的说明,我把这一块呢,也把它放到这里来。来吧,把这块再强调一下啊,有汉字也是OK的。把上海那个标下。然后我把它放这里,同学们加深一个认识好不好,加深一个认识好,同学们那关于我们不循环的细节呢,包括它注意事,注意事项老师就给大家介绍这里,下面呢,我们就来用for循环完成一些应用实例。
我来说两句