写以此文,记录我这三天(1.30-2.1)的收获和感悟。
上周把一个定时删除的服务的版本提交了,本以为在过年前的一周基本没什么事了。然而部门老哥告诉我,之前我负责的一个流媒体服务还存在两处bug
不支持多用户同时拉取视频流;
不支持重新连接;
所以这周我又忙着修改bug,然而在前两天,我还是束手无策,找不到应对方案,一筹莫展。
到了第三天老哥带我一步步熟悉整体流程,细致到每个函数,每个入参,以及每个重要的代码。不断的提问,不断的思考,再不断的提出新的问题,时间过得飞快,我也饿得快。不过最终还是蛮开心的,通过这两处bug,让我重新回顾了流媒体服务的整体工作流程,以及Go语言中对goroutine
和channel
机制,印象最深的是以下两点:
管道中的<-
简单来说就是这样子的:接受者<-发送者。
然而中间会多个管道,所以我借用Go语言圣经中的三处例子做解释
1 | ch <- x // x作为发送者发送给管道 |
所以我们可以具体化刚才说的发送接收流程,它应该为:接收者 <- 管道 <- 发送者。如果缺了接收者或发送者,都会造成管道堵塞。
互斥锁
举个例子
1 | import "sync" |
先Lock锁住,再使用Unlock解锁。
如果Lock中再套一个Lock,就会造成死锁,需要将前一个Lock解开才行。
dlv调试流程
1 | 1,./dlv debug xxxx(程序名) ##启动dlv调试 |
收获
接触一个新东西,除了保证理解了流程,还要对每个函数的作用,影响范围都要了然于胸才行;
流程这东西,光知道不行,最好的办法是自己画个流程图出来,一步步跟着代码走;
IDE有时会因为环境参数或内在bug而报错,所以推荐使用dlv(针对go)和gdb进行调试;
多对自己提几个为什么,有助于理解技术的本质;
心态放平和,坦然接受bug和不足,耐心寻求突破。
最后附一组测试成功的图片^_^