go
文章平均质量分 75
vvc223c
这个作者很懒,什么都没留下…
展开
-
go 协程(Goroutine)详解
什么是协程一种比线程更加轻量级的存在。正如一个进程可以拥有多个线程一样,一个线程也可以拥有多个协程,协程的切换和创建完全是用户决定的。进程、线程、协程对比线程和进程是完全由操作系统的分配的,对操作系统来说,线程是最小的执行单元,进程是最小的资源管理单元。goroutine和线程的关系和区别goroutine相对于线程:1.Goroutine所需要的内存通常只有2kb,而线程则需要1Mb,内存消耗更少2.由于线程创建时需要向操作系统申请资源,并且在销毁时将资源归还,因此它的创建和销毁的开销比较大原创 2022-02-25 14:59:37 · 5827 阅读 · 0 评论 -
go mutex详解
数据结构type Mutex struct { state int32 sema uint32}state表示mutex的状态,是32位的整型变量,内部实现时把该变量分成四份,用于记录Mutex的四种状态Locked: 表示该Mutex是否已被锁定,0:没有锁定 1:已被锁定。Woken: 表示是否有协程已被唤醒,0:没有协程唤醒 1:已有协程唤醒,正在加锁过程中。 Starving:表示该Mutex是否处于饥饿状态,0:没有饥饿 1:饥饿状态,说明有协程阻塞了超过1ms。Waiter原创 2022-02-24 18:37:30 · 2811 阅读 · 0 评论 -
go slice详解
数据结构type slice struct { array unsafe.Pointer len int cap int}array指向底层数组,len表示切片长度,cap表示数组容量slice的扩容机制 newcap := old.cap doublecap := newcap + newcap if cap > doublecap { newcap = cap } else { if old.cap < 1024 { newcap = doubl原创 2022-02-24 17:50:28 · 522 阅读 · 0 评论 -
go select特性和原理
特性select是Go中的一个控制结构,类似于switch语句,用于处理异步IO操作。go select 的特性:1.case语句必须是一个channel操作。2.select中的default子句总是可运行的。3.所有channel表达式都会被求值4.所有被发送的表达式都会被求值5.如果没有可运行的case语句,且没有default语句,select将阻塞,直到某个case通信可以运行6.如果有多个case都可以运行,select会随机公平地选出一个执行。其他不会执行。否则执行defaul原创 2022-02-24 16:31:07 · 685 阅读 · 0 评论 -
go defer使用规则与具体实现
defer规则规则一:延迟函数的参数在defer语句出现时就已经确定下来了func defertest() { a := 1 defer fmt.Println(a) a = 2 return}输出结果是多少呢?结果是1defer语句中参数在defer语句出现时就已经确定下来了,实际上是拷贝了一份。后面对变量a的修改不会影响fmt.Println()函数的执行,仍然打印1。func main() { a := 1 defertest2(&a)}func pr原创 2022-02-21 17:17:37 · 585 阅读 · 0 评论