00:00
各位,我们接着刚才讲的内容呢,继续向下面讲解啊,刚才呢,我们讲了一下China的初始化,China的读,还有这个读,呃,写入啊,还有这个取出,对不对,这个呢,我们都说过了,说过了包括它的一些注意事项,我们就聊完了,对不对?呃,那么这地方再做一个小小总结,Channel中只能存放指定的数据类型,什么意思?也就是说,如果你这里指的指的是一个int,那你就不能这样存放,说老师我我跟里面放放一个九,这个时候你一存放呢,大家看到它也会报错的,他告诉你很清楚啊,CONSTANT10.9ED就是不能够这个呃,截取到截取成一个inter啊,Inter不能算是一个整数,所以说这样再大家要注意这个细节啊,这是啊第一个需要注意的,第二个数据放满以后就不能再放图了,就你放满了再去放,它会报一个实数。如果从参照中取出数据,可以继续放,说老师这什么意思呢?各位同学看这个细节刚才没有讲到什么意思呢,就说我在这地方再放肯定是要报错的,但是但是如果如果我从这个China in the里面取了一个,我再放一个,这个是没问题的。其实。
01:16
它这个管道最重要的一个价值就是在水一边往里面放,一边从这边取,它就像一个管道一样看同学们想,我们现实生活中一个水管,它其实是个水流在不停的流动的,没有哪一个东西在里面静态不动,如果一个水在那个管子里面不动,那就不叫水管子,那叫什么,那叫池水池了,是不是这个道理啊?所以说我们这个在我们要把什么样的数据放在这个管道里面呢?就是这种数据它是流动的,它是一边往里面放,同时呢,还要另外一个重新读,而这种需求其实特别多。其实特别特别多,如果这个机制一旦形成,同学们他们之间的通讯机制也就自动形成了,所以说我们来讲这个细节哪里呢?就是如果说当当这个China取出数据后可以继续存放,那我给大家演示一个小案例,各位同学请看。
02:10
就说现在呢,我们往往这个42号往里面放东西的时候,肯定是要报错的,刚才大家也看到了,的确报错。的确报错,看在这个第42层包括了,因为你已经已经这个取完了啊,已经放满了吗?大家看。啊哦,不,这写错了啊,这写错了,应该是这。你在上面这个地方往里面放的时候啊。往里面放的时候,那如果说我们取一个再放就没问题了啊,第98行往里面写。写的时候你因为已经放了三个,再放就报错了啊,就这个意思。如果从参数取出去可以预方,你看我取一个出来,怎么取呢,Int。圈就可以了,注意取的时候也可以不给他任何值,周老师这样写行不行也可以,这句话就代表说我把这个管道里面数据取出来扔了,我不要。
03:07
可以的啊,不是说非要拿一个变量你接收可以不接收,可以不接收啊,有时候你还就要利用这种特性,就是我想把它扔出去就完了,有有个数据我不想要,这也叫取,只是你没有接收而已,大家看这个时候呢,第24行是不会报错的。第20,市场是不会报错的,看代码。那这个地这个这个是44行是哪哪错的原因。哦,这个这个是因为你你又放你又取不停的取,取多了是吧?啊取多了原因好,我们再看这个再看一下啊,这个时候再再看一下,那下面这个NUMBER5呢,是没有的,先把注销掉。哎,把它注销掉。好,同学们,我们再来看看,这个时候我一共放了一个。两个三个,在放第四个之前呢,我先取了一把。好,这个不会报错了,可以了,成功好可以了,这是我们说的这个这个细节再看下一个,在没有使用协程情况下,如果圈的数据取完了再去就报错,好刚才也说过了啊好同学们,那么使用注意事项我们就把它整理到笔记里面来,下面呢我们就来。
04:16
看一个具体的其他的案例,找一个跟上思路啊,现在来一个标题三。标题三好第一点。对。第一点。第二点。第三点,哎,我们往里面放东西了。第四点。好了,这个China使用的注意事项我们就聊到这里,然后呢,我们再来看下一个读写China的各种案例,前面已经有这个案例了,所以说有些呢,我就不写了,我就直接看一下幻灯片,大家就应该能够接受看看啊,这边看这里。第一个案例,创建一个channel,最多可以存放三个int,演示存放三个数据到int圈,然后取出,相信同学们应该能看懂,好,放三个,放了个12,十三十,好,这边取一个NUMBER1 number number3来,同学们,我们一起回答一下第一个NUMBER1是多少?
05:16
第一个NUMBER1取出来是多少十?第二个NUMBER2是多少20,第三个NUMBER3是多少30啊,40是对的啊,所以说正确第一个欧了,接着我们往下看第二个幻灯片。第二个幻灯片是一个map channel,也就是说我们想创建一个存放十个map的这么一个这个管道,那怎么办呢?同学们看代码。Map channel map。大家想象到啊,如果这样存放在我们管道里面,放的是十个数据,但每一个数据都是一个map。这个很清晰的知道啊,就说这边有很多很多的map,这有个map对吧,这边又来一个map,这边又来map,这边又来map等等十个。
06:05
那么具体来说呢啊,我我这写的是对,我这放了个十个,那么每个map里面注意题,每个map里面有可有多对的KKY6这个大家能能懂吧。就每个map里面还可以多个KY6,好,所以大家看我这放的是每个map里面,我初始化的是十二十个KY6,那你看MM1我放进去了,这个呢,我创建一个M2里面放的是宋江和武松,然后呢,我把M1推到这个。队列里面,我把M2推到推送到map圈里面去,这个大家应该看得很清楚。啊,这个我就不再多说了,其实使用的方式跟前面一模一样,只是大家要注意一点,如果你像这一个管道里面。放这个麦普你在。使用map之前,先要MAKE1把。OK,好,这个呢不说了,接着往下看第三个使用。
07:05
Cat圈就说我希望同学们存放十个cat结构体,演示写入和读取方法,大家看一下啊,这我创建了一个管道,这个管道可以放十个K的实例。有猫猫的实力。我创建了第一个猫猫,创进了第二个猫猫,把它推到这个管子里面去,把猫二也推到了这个管子里面去,取的时候很简单,这面取就完了。这个案例大家也看懂了,说白了就是给大家演示一下,我们这个管道是可以存放结构体实例的。好,第三个说完了第四个。也可以放指针,就说我们这个管道呢,也可以放指针,这就不再说了啊,这大家应该很好理解,不行不说了啊,接着看第六个题,第二个题。那么有些时候呢,我们可能有这种需求,就说我们希望在这个管道里面放的数据是混合类型的,我们既想放结构体,我们又想放字符串,可以没有问题,那这个时候呢,注意同学们注意听啊,这边有些细节要聊一下了。
08:16
首先你在定义这个map的这个管道的时候,应该是interface这个空接口。那么为什么定空接口就可以了呢?因为。任何变任何这个数据类型,我们认为都实现了空接口,因为空接口什么方法都没有啊。所以说呢,你给他传,他可以接受好接受的时候呢,同学们看取的时候就这样子取的啊。啊,取出来。一个KD1KKD22V1V2,好,这个也很也很轻松啊,这大家应该能看懂,好第六一个,那么我们请同学来思考一段代码,既然刚才老师讲到我们向管道里面可以推送任何数据类型,只需要把它的类型声明成空接口类型,这个没有问题。
09:06
那么现在我要请同学们看这段代码会输出什么?各位。认真的考虑。看一分钟,我找同学来回答。好的。同学们,回找一个同学啊,待会儿。好,我找一位同学,看看他会回答这个什么样的结果啊,好的,我找一位朋友,嗯。叫做。这个。谈笑来回答一下吗?来谈笑。小谭,你觉得这个会书是什么?
10:02
会做什么呢?这个地方会报错是吗?这个为什么会报错呢?开的幺幺点,那为什么会报错呢?不是取出来了吗?发的猫。Interface是空的。这原因好像没有说的很对哈,那我这样问你吧,就说这么汇报说,那你如果要解决这个问题,就是我就想把这个名字再取回来,我应该怎么办?这样说吧,就这样,这样问也行。这个报错肯定他应该是回答对,正确的。啊,对。大家能想起来吗?就是这般应该用什么东西解决啊?用类型断言,因为为什么啊?同学们想好,同学们注意听,我们可以这样理解,这是我们的一个管道,这是我们的一个管道。那么这个管道里面呢,你推送了一个猫猫一进去,好当你推进去这个猫猫一的时候,其实就等价于什么意思呢?相当于这种感觉啊,注意听,相当于把K1这个变量赋给了一个interface的一个变量,能能理解这意思吧。
11:16
相当于说你把传给了一个空接口,那么你传空空接口过后,你把这个K1取出来,它的类型是什么类型呢。它的类型是什么呢?它类型是什么呢?是不是一定是空接口呢。他打算什么类型?这还画个问号。但是这方取肯定是不行的,来我们看一下,来这边这地方是一个考点,那么刚好呢,就给大家写写这阶段就是容易出问题的代码,来写一个。我们估且叫做China练习吧,最听讲啊。China。China的一个练习,RCI,注意听各位同学打开它,我们写段代码啊,注意听讲main.go main.go package主包,然后import,对不对,Might,然后function主函数走,现在呢,我们迫切需要点垫一个猫猫进来,那就是type type里面呢,我们就写简单一点,就是一个名字,一个年龄就完了。
12:24
名字是寸年龄edge行吗?那现在呢,我们来定义一个可以存放任意数据类型的这么一个管道啊,我们定义一个可以存放存放任意数据。数据类型的一个管道,那么这个管道呢,假设我们存放啊三个数据吧,三个数据看啊同学们看。来写写一下VR,我们叫做all channel,就是任何东西都可以放,然后定义的是,然后interface空接口。
13:00
写完了,然后呢,我们给它来创建一下make一下空间,Make,然后呢就是change interface走啊然后呢放三个注意,其实这个代码呢,也可以这样写,上面如果什么都不写,用类型推导也可以。这样也可以啊,就是在我们开发中呢,这种写法应该更简洁,只是我这样写呢,更明确,就看你的习惯,下面这个写法呢,在开发中用的比较多一点,就简单嘛,好放三个数据。好,放三个数据,好,现在呢,我往这个第一里面先推送一个啊,我先推送一个呃,整数啊,推送一个整数往里面写,比如说写了一个十好,我再推送了一个字符串看啊同学们,我再推送一个字符串,比如说写了一个汤姆Jack Tom Jack。好,紧接着呢,我还想给他推送一个猫猫这个实例,对不对,那先建一个猫猫,先建一个猫猫cat走,给它来进行一个初始化,第一个呢,这个猫的名字叫做小花猫。
14:04
他的年龄呢,对他的年龄呢,我们认为是比如说这个猫四岁了,行吧,啊后面这个可以不要,然后呢,把它推进去也有三个应该够用。把这个猫猫推进去。好,各位同学,现在我想拿到这个猫猫,注意听,我现在只关心拿这个猫猫,我怎么做呢?是不是我可以这样,因为我只关心第三个数据,是不是前两个我认为很麻烦,说老师我能不能有一种能力,我跳过前两个数据,直接拿这个猫猫呢,没有。你要这么玩的话,它不是管它就不是队列了啊,所以老师我想取哪个就取哪个呢,那这样子不行啊,不能说你想取哪个就取哪个,那这样的话就不要管道了啊,他这样子的,如果你想取第第第三个这个数据,那你先把这两个先推推走,怎么推呢。我们希望注意听,希望获取到哪个,第三个获得到第三队列中啊叫管道中,管道中。
15:08
管道中的第三个元素则先推出。前两个则先。则先。将前两个前两个推送出推推走推出推出推出的话呢,很简单哦。你因为你不想要嘛,那你干脆就扔掉就完了就扔掉。一个任意磁三那两次,当然你可以用个负循环,你用可以负负循环,待待会我们再讲便利啊好这个时候呢,我们想要这个猫猫了啊,现在你因为你经白了。你你已经把它推进去了,所以说我们再用一个新猫来接收6CAT,我接收一下啊,再怎么接收就是这样推。O,那各位同学,此时此刻这个猫猫就应该是cat,因为你先推进去再取的好,现在我们打印出这个猫猫的类型是什么?
16:03
就是一个从管道里面取出来的,从管道中取出,取出的这个猫是什么?我们来看看啊,同学们,这也是个很有意思的TPTF,走,我们先看它的类型,New k等于百分T,好,然后呢,我们再来看它的这个值,New k等于百分V输出一下。第一个就6K。第二个也是look k,我们跑一下同学们。好,这个代码就写完了,我们来跑一下。CD点点CD到China练习。好,Go run man.go跑。我们看到这里呢,很有意思啊,很有意思,同学们看到。这时呢,我们的的确确告诉你,New k是一个是man这个包包下面的K这个类型,它的值呢,是小花猫,诶,这有点意思了,说老师,那你这样取出来不就已经是个结构体了吗?但是我们发现一个非常有意思的现象,各位同学快呢,好,我们取出这个猫猫的名字。
17:15
大家看啊,k.name等于V,我们把它名字取出来看一下6K。第二。点,然后呢,Name好,我们来执行一下,看这个名字能否取出来啊,诶有报错。啊,哪哪哪把我锁了。好,各位同学,各位同学,当我们运行的时候,他已然报错了,他直接告诉你。六。New k name啊,写的很清楚,Type interface is。Inter with no message,就说你这个类型,虽然在这地方编译的时候,他确实打印出来是这个,但是他从编译这个层面,他从这个编译这个层面,他仍然认为这个new cat是一个interface,所以说它编译的时候呢,他告诉你编译技术,对不起啊,我不知道是什么,因为大家都知道接口里面是没有。
18:15
字段的,因此它报错。也就是说他在编译层面,他认为这个new k仍然是一个interface,他说的很清楚啊,看这。说type,他直接说type interface is no inter,他说是,他说is,他说是一个接口,With什么呢?是没有这个方法的一个接口啊,没办法,那你这啥都没有。就是用不了,但是你很难理解说,哎,老师你不是打出来了吗?注意啊,这个打印的时候,它是在运行的层面上,它在运行的那一瞬间,他发现哦,你是这么类型,但是你在这输的时候,他是在编译这个层面,因此找不到东西。好,也解释清楚了,那怎么办?很简单,刚才彭晶同学说了一嘴,他说类型断言咱们学过,类型断言转一下就完事了,来吧,同学们,我们把它转一下啊。
19:05
因为你这个猫猫类型钻研还记得怎么怎么做吗?是不是六。点儿夸起来。Cat是不是就可以了,然后呢,我们用一个变量来接收,用一个变量,比如说我用一个呃,一个A吧,我我就不写那么多A,好,这个时候这个A才是真真正正的猫猫啊,真正正啊,这样写就没问题了。啊,这样就可以上,前面那个是不行的,这样取就对啊,刚才那个是不行的,所以说我把那个错误先写到这,这个是不行的。直接这样写是不行的啊。这种写法是错误的,编译器不识别,他主要是编译器不识别。下面的写法是错误的。错误的OK编译器,编译器通不过,主要是编译就通过,编译不通过。好的,那应该怎么做呢?应该用一个类型断言。
20:03
二使用类型断言即可。啊,使用使用。类型,类型断言。好雄类型,断言的话呢,那也非常简单哈,就把刚才这句话拿过来。考一下。当然把名字取出来就行了,走A点零。好,这个时候呢,它会取出小花猫。跑一个。OK,小花猫取出来了,好,同学们,就这么一个细节啊,就是一定要注意它有这么一个问题在这地方。好了,同学们,那关于这个读写的一个细节和几个练习呢,我们进行一个板书,对我们进行板书啊,使用细节我们做了一些小练习啊,反思一下,刚才呢,我们举了这么一些读写的练习,大概六个。那么我应该放到笔记里面去,因为你们以后这个在工作过后啊,可能就没有机会再去看这些基础知识了,对吧,比如说你参加工作以后,你都已经号称有两年经验了,跟人家说的,结果你把那个笔记拿天天在看是吧,这个不好意思还偷着看,怪不好的是吧,所以说呢,尽量咱们就是能把这些基本知识呢,就在这儿全部搞定好,我简单给罗列一下啊,好,第一个案例。
21:20
第一个案例就是讲的一个基本数据类型的管道。对第一个第二个案例,各位朋友,第二个案例呢,我讲了一个存放map。就是映射的这么一种管道,诶大家看一下第三个案例呢,第三个案例我讲的是一个存放结构体的这么一个管道案例,对。这是第三个案例,第四个案例呢,我讲了一个是存放,存放什么呢?存放这种结构体指针的这么一个案例,它也可以存放啊,同学们。它是可以放结构体指针的,好第五一个案例,第五一个案例呢,我讲的是存放任意数据类型的这么一根管道。
22:07
对,这是一个第六一个呢,我出了一个题,引起大家思考,就说下面代码会出现什么问题,对吧,这么我们得出得出一个结论是什么呢。得出这个结论,就是说呃,是这样子的,最后我们得到的结论是这样子。就是这个地方啊,要转的时候呢,像这种写法是错的,应该使用类型断言搞定它好,这个是解决方法。啊,具体来说应该是这样处理,把它标成一个红色啊,具体来说要这么去处理。好,给它来一个红色的线。类型断言。好,这个时候再去就是OK的。好,我把它放在笔记里面去。好的,同学们,那关于他的一个练习,还有细节,我们就说完了。
我来说两句