defer 用于延迟函数的调用,每次defer都会把一个函数压入栈中,函数返回前再把延迟的函数取出并执行 延迟函数的参数在defer语句出现时就已经确定下来了 如: func a() { i := 0 defer fmt.Println(i) i++ return } defer语句中的fmt.Pr
go语言中并发安全和锁 首先可以先看看这篇文章,对锁有些了解 【锁】详解区分 互斥锁、⾃旋锁、读写锁、乐观锁、悲观锁 Mutex-互斥锁 Mutex 的实现主要借助了 CAS 指令 + 自旋 + 量 数据结构: type Mutex struct { state int32 sema uint3
实现原理 垃圾收集的多个阶段: 清理终止阶段(STW) 暂停程序,所有的处理器在这时会进入安全点 我的理解是这里stw,等待所有协程都知道要开始打开写屏障了,不然无法做到统一 如果当前垃圾收集循环是强制触发的,我们还需要处理还未被清理的内存管理单元 标记阶段-并发执行 将状态切换至 _GCmark
哈希表 242. 有效的字母异位词 func isAnagram(s string, t string) bool { var m [26]int for _,v:=range s{ m[v-'a']++ } for _,k:=range t{ m[k-'a']-- } for _,w:=range
GC垃圾回收机制设计原理 标记清除 1.3版本之前。大概分为两阶段: 标记阶段 - 从根对象出发标记堆中存活的对象 清除阶段 - 遍历堆中所有对象,回收未被标记的垃圾对象 1.0版本:是完全串行的,这两个阶段都在STW暂停范围之内 1.1版本:在多核主机并行执行垃圾收集的标记和清除阶段 缺点:整个过
异步协程 package main import ( "gopkg.in/gin-gonic/gin.v1" "time" "log" ) func main(){ // only set in Production // gin.SetMode(gin.ReleaseMode) router :=
一般情况使用 c.ShouldBindJSON c.ShouldBind 第二次读取 request body 的数据就会出现 EOF 的错误,因为 c.Request.Body 不可以重用 gin 1.4 之后官方提供了一个 ShouldBindBodyWith 的方法,可以支持重复绑定,原理就是
GMP Goroutine调度是一个很复杂的机制,下面尝试用简单的语言描述一下Goroutine调度机制,想要对其有更深入的了解可以去研读一下源码。 介绍 首先介绍一下GMP什么意思: G goroutine: 即Go协程,每个go关键字都会创建一个协程。 M thread内核级线程,所有的G都要放
Copyright © 2005-2024 51CTO.COM 版权所有 京ICP证060544号