2019年初在做流媒体服务时对三处细节印象深刻,特整理记录下来。
## 管道中的`<-`
简单来说就是这样子的:接受者<-发送者。
然而中间会多个管道,所以我借用Go语言圣经中的三处例子做解释
```go
ch <- x // x作为发送者发送给管道
x = <-ch // 管道作为发送者发送数据给接受者x
<-ch // 管道发送数据,没有接收者,丢弃,同时造成管道堵塞,等待接收者
```
所以我们可以具体化刚才说的发送接收流程,它应该为:接收者 <- 管道 <- 发送者。如果缺了接收者或发送者,都会造成管道堵塞。
## 互斥锁
举个例子
```go
import "sync"
var (
mu sync.Mutex // guards balance
balance int
)
func Deposit(amount int) {
mu.Lock()
balance = balance + amount
mu.Unlock()
}
func Balance() int {
mu.Lock()
b := balance
mu.Unlock()
return b
}
```
先Lock锁住,再使用Unlock解锁。
如果Lock中再套一个Lock,就会造成死锁,需要将前一个Lock解开才行。
## dlv调试流程
```
1,./dlv debug xxxx(程序名) ##启动dlv调试
2,r(restart)
3,c(continue)
4,b(break) ##打断点,可以打函数名,也可以打文件下对应的行号
5,n(next)或s(step) ##n按一次单步执行,后面只需一直按回车;遇到需要深究的函数按s进去查看
##如果碰到多线程,建议在线程内打个断点
6,bt(stack) ##查看堆栈
7,frame ##查看指定堆栈的内容
8,q(exit) ##退出调试
```
## 收获
- 接触一个新东西,除了保证理解了流程,还要对每个函数的作用,影响范围都要了然于胸才行;
- 流程这东西,光知道不行,最好的办法是自己画个流程图出来,一步步跟着代码走;
- IDE有时会因为环境参数或内在bug而报错,所以推荐使用dlv(针对go)和gdb进行调试;
- 多对自己提几个为什么,有助于理解技术的本质;
- 心态放平和,坦然接受bug和不足,耐心寻求突破。
[原文链接](https://niannian.cleer.club/category/%E6%8F%90%E9%97%AE%E5%AD%A6%E4%B9%A0%E5%B8%A6%E7%BB%99%E6%88%91%E7%9A%84%E6%94%B6%E8%8E%B7/)
有疑问加站长微信联系(非本文作者))