Go基础知识
文章平均质量分 96
Go基础知识
curd_boy
热爱编程,喜欢探索新技术
展开
-
【Go】Channel底层实现 ②
如果没有缓冲区,单纯的往其中放入元素立马就会进入阻塞状态,必须有其他的线程从其中取走元素。通俗的讲要有一个线程不断的取这个管道的元素,才能往其中放入元素。G2因为有runnext指针,因为亲和性的原因优先级较高,会把G2调度到原来的P local quene中(p.runext指针)而有一个缓冲区的管道想一段地道,放入的元素不会马上进入阻塞状态,只有第二个准备进入而第一个还没有进入的情况下才会阻塞。这一次会优先判断缓冲数据区域是否已满,如果未满,则将数据保存在缓冲数据区域,即环形队列里。原创 2024-01-27 23:54:45 · 1124 阅读 · 0 评论 -
【Go】深入理解 Go map:赋值和扩容迁移 ①
Map 的赋值难点在于数据的扩容和数据的搬迁操作。扩容不是一定会新增空间,也有可能是只是做了内存整理。tophash 的标志即可以判断是否为空,还会判断是否搬迁,以及搬迁的位置为X or Y。delete map 中的key,有可能出现很多空的kv,会导致搬迁操作。如果可以避免,尽量避免。原创 2024-01-27 23:49:43 · 2090 阅读 · 0 评论 -
【Go】Mutex锁相关 ③
Mutex 就实现了这个接口,Lock请求锁,Unlock释放锁Locked:表示该 mutex 是否被锁定,0 表示没有,1 表示处于锁定状态;Woken:表示是否有协程被唤醒,0 表示没有,1 表示有协程处于唤醒状态,并且在加锁过程中;Starving:Go1.9 版本之后引入,表示 mutex 是否处于饥饿状态,0 表示没有,1 表示有协程处于饥饿状态;Waiter: 等待锁的协程数量。方法解析。原创 2023-08-17 12:55:00 · 801 阅读 · 0 评论 -
【Go】标准库底层实现 ①
文章目录数据类型引用类型slicemapchannelchannel存在3种状态:context原理panic revover为什么defer才能recoverreflect什么是反射为什么要用反射,(需要反射的 2 个常见场景)defernew make数据类型引用类型slice扩容规则当需要的容量超过原切片容量的两倍时,会使用需要的容量作为新容量。(长度是奇数就+1为容量,是偶数就长度为容量)当原切片长度小于1024时,新切片的容量会直接翻倍。而当原切片的容量大于等于1024时,会反复地原创 2021-08-20 00:49:31 · 1236 阅读 · 1 评论 -
【Go】面试篇 ②
showmebug2 6年经验1.多核cpu cache怎么保持不冲突和一致MESI解决方案 把cache 设置为四个状态,是两个bit来表示,四种状态:修改、独占、共享、失效状态更新:把内存的一块数据加载到cache中,某一个内核对这个数据进行修改,这时就是修改状态,独占的状态。有另外一个相同的数据资源修改时,这时会检测到,将独占状态变为共享状态,之前读取的数据会变成失效的状态,新的内存里面加载到cache里面,还有一些不同的情况:当一个数据处于共享状态,比如两个内核都加载同一份数据,到内核ca原创 2021-01-23 23:49:53 · 545 阅读 · 0 评论 -
【微服务】Go进阶四 日志&指标&链路追踪
日志级别https://github.com/golang/glog,是 google 提供的一个不维护的日志库,glog 有其他语言的一些版本,对我当时使用 log 库有很大的影响。它包含如下日志级别:InfoWarningErrorFatal(会中断程序执行)还有类似 log4go,loggo,zap 等其他第三方日志库,他们还提供了设置日志级别的可见行,一般提供日志级别:TraceDebugInfoWarningErrorCriticalFatal记录消息后,直接调原创 2021-04-24 23:34:08 · 737 阅读 · 0 评论 -
【Go】Golang runtime调度③
文章目录调度-GMP调度模型1. GMP支撑了 Go 的高并发2. GMP定义3.Goroutine vs OS thread 有什么区别?抢占1.go协程阻塞时如何进行调度?1. 只G阻塞,M,P可用的2. G,M都被阻塞,P可用系统调用(open file) system call2.GO的调度过程:2.5 PMG模型中状态汇总G状态P的状态M的状态如果Goroutine 一直占用资源怎么办,PMG模型怎 么解决的这个问题?1,如果某个M陷入阻塞呢?2,如果有的M较忙,有的M较闲呢?3,如果一个G运行时原创 2021-02-09 10:31:37 · 1126 阅读 · 1 评论 -
【Go】Golang内存管理篇 ⑤
一. 内存管理内存分配器堆和栈区别1.空间分配区别:栈:由操作系统(编译器)自动分配释放,存放函数的参数值,局部变量的值等,其操作方式类似于数据结构中的栈。堆:一般由代码分配释放,若代码没有显式释放,程序结束时可能由OS回收,分配方式类似链表。2.缓存方式区别:栈:使用的是一级缓存,通常都是被调用时处于存储空间中,调用完毕立即释放。堆:存放在二级缓存中,生命周期由垃圾回收算法来决定。3.数据结构区别:栈:先进后出的线性结构。堆:类似于一颗树。1.1 go内存分配原创 2021-07-16 15:19:18 · 1017 阅读 · 0 评论