
Go
文章平均质量分 73
袁蕴旭
Don't be sorry.Be Better.
展开
-
Go 把并发留给调用者处理
func ListDirectory(dir string) ([]string, error)func ListDirectory(dir string) chan string上述两个API有什么区别?第一个,是同步请求,如果目录较大,需要分配大量内存,也需要需要很长时间第二个,返回一个string类型的chan,通过chan传递目录,通道关闭时,表示不再有目录。由于在返回后发生通道的填充,函数内部启动goroutine来填充通道针对第二个,还有两个问题:把关闭通道视为结束的信号,原创 2021-04-29 01:30:39 · 264 阅读 · 0 评论 -
Go中的 slice 和 array
本文是听过Go进阶训练营《再探Golang的slice、map、channel》之后一些思考。一、array数组的定义:var buffer [256]bytearray的存在是必要的,它可以很好的表示矩阵信息,但是在Go中数组的存在,更重要的意义在于作为slice的源数据存储介质。二、slice切片的定义:var slice []byte = buffer[100:150]那么slice这个变量在这里究竟是什么呢?我们采用下面的表述形式来理解slice:type sliceHeade原创 2021-04-25 21:44:36 · 371 阅读 · 0 评论 -
Go 为什么不提供可重入锁?
分享下Russ大神的观点,英文原版可重入锁是一个非常差的设计。使用锁的一个最基本的原因是,锁可以保护变量(后续称之为invariant),使其不被其他因素改变。明确这一点,就可以判断某个场景下,是否应该使用锁。举例说明:一个使用原子操作实现的计数器,是否需要使用锁?这取决于invariant.如果invariant就是这个计数器本身,那么原子操作足以保证并发安全,不需要锁。但是如果这个计数器需要和其他数据结构(比如列表中元素的个数)保持一致性,那么独立的原子操作就不够了,这种情况下就需要使用锁机原创 2021-04-25 16:21:10 · 968 阅读 · 0 评论 -
Go 并发安全的有序单链表实现
多个goroutine访问同一个变量,需要考虑Data Race的问题。可以使用下面的命令来进行检测:go test -race 或者 go run -race解决方案:使用atomic库或者sync.Mutex,对访问顺序进行限制。atomic,一般在单个变量一写多读的场景使用, Compare And Swap虽然可以用于多写多读,但是应用乐观锁,效率不高sync.Mutex,一般在多个变量的多写多读场景使用针对当前问题,实现并发安全的有序单链表,最简单的思路是,对给单链表加锁。如果是原创 2021-04-25 01:13:31 · 534 阅读 · 1 评论 -
Go 错误处理的最佳实践
文章目录一、Error二、panic三、不透明的错误四、处理错误一、ErrorGo 中实现了Error()方法的对象都是一种error。type error interface { Error() string}errors.New() 返回一个errorString对象的指针,errorString对象就实现了Error()方法。type errorString struct { s string}func (e *errorString) Error() string原创 2021-04-21 01:24:58 · 548 阅读 · 0 评论