有关go管道,锁和dlv调试的细节分享

OctopusLian · · 2820 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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/)

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2820 次点击  
加入收藏 微博
被以下专栏收入,发现更多相似内容
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传