- 博客(10)
- 收藏
- 关注
原创 Go 函数调用━栈和寄存器视角
函数的调用过程主要要点在于借助寄存器和内存帧栈传递参数和返回值。虽然同为编译型语言,Go 相较 C 对寄存器和栈的使用有一些差别,同时,Go 语言自带协程并引入 defer 等语句,在调用过程上显得更加复杂。 理解Go函数调用在CPU指令层的过程有助于编写高效的代码,在性能优化、Bug排查的时候,能更迅速的确定要点。本文以简短的示例代码和对应的汇编代码演示了Go的调用过程,展示了不同数据类型的参数...
2019-07-14 00:18:08
1350
原创 goroutine泄露:原理、场景、检测和防范
如果你启动了一个 goroutine,但并没有符合预期的退出,直到程序结束,此goroutine才退出,这种情况就是 goroutine 泄露。当 goroutine 泄露发生时,该 goroutine 的栈(一般 2k 内存空间起)一直被占用不能释放,goroutine 里的函数在堆上申请的空间也不能被 垃圾回收器 回收。这样,在程序运行期间,内存占用持续升高,可用内存越来也少,最终将导致系统崩...
2019-07-02 18:34:11
1124
原创 golang练手小项目系列(6)-使用map实现set
问题描述go没有提供set数据结构,请用map实现set要点需要支持方法:Add 添加元素Remove 删除元素Cardinality 获取 Set 长度Clear 清空 SetContains 检测元素是否在 Set 中Pop() 随机删除一个元素并返回被删除的元素ToSlice() []interface{} 转换成slice返回拓展Clone 复制 SetDi...
2019-07-02 11:44:57
420
原创 bitcount优化之路
问题:使用Go实现bitcount函数,统计一个uint64型数值中被设置为 1 的比特位的数量。方案一:最容易想到的实现就是每次右移一位,检测最后一位是否是1,这样完成挨个比特检测后,就可以得出结果。func bitCount1(n uint64)int8{ var count int8 var i uint for i < 64 { if ( ...
2019-06-30 01:01:59
353
原创 Golang练手小项目系列
Golang练手小项目系列本系列整理了10个工作量和难度适中的Golang小项目,适合已经掌握Go语法的工程师进一步熟练语法和常用库的用法。golang练手小项目系列(1)-位向量golang练手小项目系列(2)-并发爬虫golang练手小项目系列(3)-并发读取文件夹信息golang练手小项目系列(4)-网络聊天室golang练手小项目系列(5)-并发无阻塞缓存...
2019-06-28 19:04:35
4225
3
原创 golang练手小项目系列(5)-并发无阻塞缓存
问题描述:如下的函数被并发调用时,如果有重复的URL(在一个routine中被多次访问或多个routine访问同一个url),会产生冗余的网络请求。请实现一个并发安全的缓存,以提高网络的利用效率和降低函数的执行时间。完成后你将熟悉互斥锁的使用。func httpGetBody(url string)(interface{},error){ resp,err:=http.Get(url)...
2019-06-28 19:03:00
442
原创 golang练手小项目系列(4)-网络聊天室
问题描述:实现一个网络聊天室服务端。完成之后你将熟悉select、net库、time定时器的用法。要点:用户发来的消息广播给所有接入聊天室的用户。新用户进入的时候能收到聊天室所有其他用户的名字列表。使用netcat工具作为客户端。拓展:当用户不活跃的时间超过指定时间后,断开用户的连接。代码:import ( "bufio" "fmt" "log" ...
2019-06-28 19:00:49
376
原创 golang练手小项目系列(3)-并发读取文件夹信息
问题描述:实现一个程序计算并打印输入的目录下所有文件的总数和总大小(以GB计算)。完成之后你将熟悉select、WaitGroup、ioutil的用法。要点:并发读取文件(夹)信息。限制开启的goroutines的最大数量。运行时每隔500ms打印当前已经统计的文件数和总大小(使用命令行参数指定此功能是否启用)。拓展:在执行中在有外部输入时退出程序。实现:import (...
2019-06-28 18:59:35
849
原创 golang练手小项目系列(2)-并发爬虫
本系列整理了10个工作量和难度适中的Golang小项目,适合已经掌握Go语法的工程师进一步熟练语法和常用库的用法。问题描述:实现一个网络爬虫,以输入的URL为起点,使用广度优先顺序访问页面。要点:实现对多个页面的并发访问,同时访问的页面数由参数 -concurrency 指定,默认为 20。使用 -depth 指定访问的页面深度,默认为 3。注意已经访问过的页面不要重复访问。...
2019-06-28 18:57:51
717
原创 golang练手小项目系列(1)-位向量
本系列整理了10个工作量和难度适中的Golang小项目,适合已经掌握Go语法的工程师进一步熟练语法和常用库的用法。问题描述:有一组非负整数,实现一个位向量类型,能在O(1)时间内完成插入、删除和查找等操作。要点:实现Has(uint)、Add(uint)、Remove(uint)、Clear()、Copy()、String()、AddAll(…uint)、UnionWith()、Inte...
2019-06-28 18:54:43
626
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人