golang 神坑range

总结一下碰到的一些range问题,尤其是边loop边delete的骚操作,我一直以为是人家开源库的bug,直到我看到golang官方也这么用。 首先是比较经典的问题,我们团队之前确实有人写这样代码出事了。 v是数据复制 代码本意是为了获取每个slice每个元素的指针,构造成新的slice type P struct { Name string Age int } func main() { o := []P{ P{"chain1", 20}, P{"chain2", 21} »

golang 非协作式抢占

最近因为dlv里面有个bug,关于go1.14版本之后非协作式抢占扩大了调试状态下的一些协程问题。 于是就找了原始的提议看了看,恩,果然大部分都看不懂!!! 利用google/baidu式的翻译,手敲了一遍,并且存疑的地方都加了一点东西,算是给自己一点做个笔录吧,后面有理解更深的地方会更新一下自己的理解。 翻译笔录英文版本如链接 摘要 go 当前在编译器插入的函数序章中插入协作抢占点。在大多数情况下,这足以让golang开发人员忽略抢占细节,专注于编码清晰的并行代码,但是这种方式有着非常尖锐的问题,以至于我们一次又一次的看到它降低了开发人员的体验。当它出现错误时候,就会呈现出惊人的错误现象,导致未知的系统层面的延迟问题,甚至有时候会完全冻结(就是卡住不动的意思) »

调试器与GO

调试器 如果把调试器看成一个产品的时候,首先他应该具体的功能有哪些? 1. 断点 2. 代码与当前断点映射(例如查看源码) 3. 断点过后继续运行(继续执行,单步,单出) 4. 打印变量 附属的功能: 1. 打印调用栈 2. 打印堆栈 3. 函数调用 4. 条件断点 5. 反汇编 »

go 成员方法

被虐了,原来go里面的nil可以调用方法,但是成员变量会panic https://github.com/go-delve/delve/pull/1722#discussion_r336509209 package main import ( "fmt" ) type Blah struct { } func (b *Blah) Foo() { fmt.Printf("hello! »

godbg 介绍

Start a new project, the debugger on linux platform for go. This project is inspired by dlv github地址 背景 没想到这个项目最终还是沦为为一个玩具。初次有这个想法是因为发现 gdb调试golang代码是可以进入runtime的指令,而dlv却不可以。例如像map这种的初始化 s := make( »

go源码阅读 slice

slice 对于slice来说,其实源码部分并不多,主要看一下make slice、growslice、slicecopy和copy 编译阶段 make slice语句跟map一样,在compile的typecheck阶段,将MAKE节点偷偷换成OMAKESLICE节点 关于oppend的代码实在/usr/local/go/src/cmd/compile/internal/gc/ssa.go的func (s *state) append( »

go源码阅读 defer

defer 这个话题有点大,只是翻阅了关键代码,细节太多了 主要defer要弄明白两个函数,函数目录在/usr/local/go/src/runtime/panic.go中的deferproc和deferreturn deferproc //主要这里面都不能使用栈分裂,不能进行逃逸分析,因为defer是希望利用栈内存处理 //go:nosplit func deferproc(siz int32, fn *funcval) { ... d »

go NaN

NaN 之前阅读源码,发现golang的可比性和map里面都有NaN的特判 以前写js可知,NaN与任何浮点型比较都是false,包括它自己 // main.go package main import ( "fmt" "math" ) type TestFloat struct { Float64 float64 `json:"float64"` } func main() { mp := make(map[float64] »