
go语言知识汇总
文章平均质量分 94
ashane1314
不忘初心
展开
-
图解 TCMalloc
前言TCMalloc是 Google 开发的内存分配器,在不少项目中都有使用,例如在 Golang 中就使用了类似的算法进行内存分配。它具有现代化内存分配器的基本特征:对抗内存碎片、在多核处理器能够 scale。据称,它的内存分配速度是 glibc2.3 中实现的 malloc的数倍。之所以学习 TCMalloc,是因为在学习 Golang 内存管理的时候,发现 Golang 竟然就用了鼎鼎大名的 TCMalloc,而在此之前虽然也对内存管理有过一些浅薄的了解,但一直没有机会深入。因此借此机会再巩.转载 2020-10-29 23:55:18 · 378 阅读 · 0 评论 -
golang MPG模型
线程与协程区别线程:是系统级线程,由系统自动创建,和销毁。 协程:架设在系统级线程之上的,由用户级线程,由用户(或者程序)完全控制的代码执行流程。用户级线程的创建销毁调度状态变更以及其中的代码和数据完全需要我们的程序自己去实现和处理。协程优势协程创建和销毁并不用通过操作系统去做,所以速度会很快。 不用操作系统调度运行,所以往往很容易控制,所以很灵活。协程劣势最明显也最重要的一个劣势就是复杂。线程一切操作系统代劳,而协程必须自己实现操作。GMP模型Mmachine:系统级线程原创 2020-06-27 00:43:49 · 696 阅读 · 1 评论 -
go等待一组协程结束的实现方式
waitGroupadd():产生每个goroutine时累加器加1。done():每个goroutine内部的完成销毁时减小计数。wait():等待所有add的goroutine都执行完,计数为0时触发。缓存channel不可保证顺序非缓存channel可以保证顺序package mainimport ( "fmt" _ "net/http/pprof" "time")//var wg sync.WaitGroupvar ch = make(chan原创 2020-06-25 17:58:40 · 611 阅读 · 0 评论 -
go协程泄露如何产生的、如何定位?
内存泄露概念如果你启动了一个 goroutine,但并没有符合预期的退出,直到程序结束,此goroutine才退出,这种情况就是 goroutine 泄露。当 goroutine 泄露发生时,该 goroutine 的栈(一般 2k 内存空间起)一直被占用不能释放,goroutine 里的函数在堆上申请的空间也不能被 垃圾回收器 回收。这样,在程序运行期间,内存占用持续升高,可用内存越来也少,最终将导致系统崩溃。GOROUTINE终止场景当一个goroutine完成它的工作 由于发生了没有处理原创 2020-06-25 15:41:59 · 4637 阅读 · 0 评论 -
go select 使用
select语句与通道怎样联用,应该注意些什么?select只能与channel通道联用,它由若干分支组成,每次执行这种语句的时候,一般只有一个分支中的代码会被运行。 分支分为两种分支:候选分支和默认分支,当所有候选分支都阻塞或者没有命中时候,就会走默认分支,如果没有默认分支,在所有候选分支都不命中时候,goroutine将会被阻塞,直到有一个候选分支被命中时候在唤起执行。 由于select语句是专为通道而设计的,所以每个case表达式中都只能包含操作通道的表达式,比如接收表达式。当然,如果我们需要原创 2020-06-25 12:17:26 · 653 阅读 · 0 评论 -
golang异常处理机制
error | panic | defer | recovererror错误panicpanic 能够改变程序的控制流,函数调用panic时会立刻停止执行函数的其他代码,并在执行结束后在当前Goroutine中递归执行调用方的延迟函数调用defer;recoverrecover可以中止panic造成的程序崩溃。它是一个只能在defer中发挥作用的函数,在其他作用域中调用不会发挥任何作用;现象panic 只会触发当前 Goroutine 的延迟defer函数调用; recov原创 2020-06-24 22:23:23 · 331 阅读 · 0 评论