发布了文章2019-10-24
golang map是非goroutine安全,如果多个goroutine使用map需要加锁。但在高并发场景下,锁的争用会造成系统性能的下降。为了解决这种问题,go 1.9之后提供了线程安全:sync.map。sync.map引入了两个数据结构read,dirty来存储,他们的底层都是用map来实现。
发布了文章2019-10-18
golang map的实现源码在文件 runtime/map.go中,map的底层数据结构是hash表。hash函数:通过指定的函数,将输入值重新生成得到一个散列值hash表:散列值会确定其键应该映射到哪一个桶。而一个好的哈希函数,应当尽量少的出现哈希冲突,以此保证操作哈希表的时间复杂度
发布了文章2019-10-12
panic和recover是golang的两个内置函数。当函数F调用panic,函数F会停止运行,F包裹着的defer函数会全部正常运行,然后返回调用F的函数。如果没有recover,F对于调用方,就像panic。Process继续执行堆栈,直到发生panic的goroutine所有方法返回。panic可以被runtime ...
发布了文章2019-10-09
最后输出结果是 i is nil false, i = <nil>这是因为interface是由两个元素type:T 和value: V所表示。V是具体值,比如int, struct, pointer的具体值。var i interface = 3, i的type是int, value是3。只有当type和value都没有设置(T=nil, V 没有赋值)时interf...
发布了文章2019-10-08
defer是golang提供的关键字,在函数或者方法执行完成,返回之前调用。每次defer都会将defer函数压入栈中,调用函数或者方法结束时,从栈中取出执行,所以多个defer的执行顺序是先入后出。