
Golang
师薄零
即将进入外卖行业的优秀程序员!!!
展开
-
golang协程调度详解之GMP模型
什么是GMP?Ggolang协程M内核线程(真正执行计算的资源)P逻辑处理器(队列)调度器生命周期•1 go func() 创建G•2.1 放入局部队列•2.2 如果局部队列已满则放入全局队列•3 M1 获取G 进行计算•3.1 M1 从P的本地队列中获取一个G绑定进行计算•3.2 如果本地队列为空则从全局队列获取•3.3 从其他的MP组合中窃取G•4 调度•5 执行G.func()•5.1 如果G.func()发生systemCall/阻塞 (systemCall:程序从内原创 2021-07-26 11:52:57 · 398 阅读 · 0 评论 -
golang gin如何添加自定义中间件
func TestMiddle() gin.HandlerFunc { return func(c *gin.Context) { fmt.Println("logging...") }}func InitRouter() *gin.Engine { r := gin.New() r.Use(gin.Logger()) r.Use(gin.Recovery()) r.Use(TestMiddle()) apifront := r.Group("addiction") ap.原创 2021-04-12 20:18:55 · 345 阅读 · 0 评论 -
Golang调度器
G:goroutineP:逻辑处理器M:真正执行计算的资源每个goroutine都有一个状态,Scheduler根据状态知道要运行哪个goroutine 可运行(Running) 正在运行(Runnable) 已经阻塞(Blocked) M:N有一个全局运行队列(Global Run Queue) ,某些操作会将新的Goroutines放入运行队列。但是那些阻塞的Goroutines会在哪里呢?可能阻塞的情况: Cha...原创 2021-04-08 16:50:21 · 160 阅读 · 0 评论 -
在golang grpc中如何使用拦截器
在我认识的人当中大多数对中间件都有深刻的认知,但是对拦截器却知之甚少。接下来让我们剖析一下拦截器,来学习下怎么写和使用拦截器,并且为什么要这么做。gRPC是一项伟大的技术,我把之前写的许多API替换成了这种方式。我发现开发gRPC接口比基于HTTP的接口要更加容易。我还是建议大家花点时间去学习下这项技术。这里已经是这个系列的第2部分了,但是你并不需要一些预习的知识,甚至不需要去看第1部分和1.1部分.- 1- 1.1- 2(我们在这里)- 3 gRPC的数据流在普通的HTTP服务中,我们...原创 2021-04-07 16:11:37 · 750 阅读 · 0 评论 -
Go基础知识点汇总思维图
原创 2021-03-29 10:49:55 · 209 阅读 · 0 评论 -
golang如何解决import cycle not allowed的问题
1.import cycles now allowed是如何产生的?2.几种解决方式原创 2021-03-15 15:02:10 · 817 阅读 · 0 评论 -
golang select的几种情况解析
func main() { msg := make(chan int) select { case <-msg: fmt.Println("msg") default: fmt.Println("default") } msg <- 1 time.Sleep(time.Second * 1)}:default fatal error: all goroutines are asleep - deadlock!func main() { ...原创 2021-03-09 13:41:23 · 135 阅读 · 0 评论 -
Golang中的select应该怎么用
1.什么是select select就是用来监听和channel有关的IO操作,当 IO 操作发生时,触发相应的动作。2.基本用法 select { case <- chan1: pass case chan2 <- 1: pass default: pass }如果有一个,或者多个IO操作可以完成,则golang运行时会随机选择一个执行,否则的话会执行default分支语句,如果没有定义default的话会一直阻塞3.思考输出...原创 2021-03-02 18:00:00 · 207 阅读 · 0 评论 -
all goroutines are asleep的一次记录
func testDeadLock(c chan int) { for { fmt.Println(<-c) }}func main() { c := make(chan int) c <- 'A' go testDeadLock(c) time.Sleep(time.Millisecond)}上面的代码会产生fatal error: all goroutines are asleep - deadlock!的错误提示func testDeadLock(c .原创 2021-03-01 16:46:33 · 115 阅读 · 0 评论 -
基于Golang的冒泡、插入、选择排序demo
1.冒泡排序package mainimport "fmt"func main() { arr := []int{8, 12, 46, 12, 2, 4, 15, 3, 9, 44, 5, 6, 1, 59, 2} fmt.Println(bubbleSort(arr))}func bubbleSort(arr []int) []int { if len(arr) == 0 { return arr } for i := 0; i < len(arr); i++ {原创 2021-03-01 15:28:19 · 105 阅读 · 0 评论 -
Golang defer运用规则
1.是什么defer是Go语言提供的一种用于注册延迟调用的机制:让函数或语句可以在当前函数执行完毕后(包括通过return正常结束或者panic导致的异常结束)执行。defer通常运用在 打开/关闭连接,加锁/释放锁,打开/关闭文件。2.为什么要用defer我们在编程的时候经常会使用到一些外部的资源,比如文件、连接、锁 等,使用defer关闭这些资源避免可能造成的一些内存泄露的问题。3.怎么用deferfunc f1() int { r := 1 defer fun原创 2021-03-01 14:19:55 · 175 阅读 · 1 评论 -
Golang gc(垃圾回收)机制
1.什么是GC 程序创建对象等引用类型实体会在虚拟内存中分配给他们一块内存空间,如果该内存空间不再被任何引用变量引用是就变成了需要被回收的垃圾。对于一个运行时间比较长的程序,如果产生的内存垃圾没有及时被回收,就会造成内存泄露甚至系统崩溃等问题。2.常见的GC算法引用计数 标记-清除 节点复制 分代手机3.golang的gc算法 3.1 何时触发gc 在堆上分配大于 32K byte 对象的时候进行检测此时是否满足垃圾回收条件,如果满足则进行垃圾回收。...原创 2021-03-01 11:09:54 · 431 阅读 · 0 评论