进程是如何创建的?

这次简单总结探究一下 Go 对进程相关操作的封装。 Go 中通过名称或者路径可以很简单的启动一个进程(命令): ret, _ := exec.Command("bash", "-c", "ls -a -l -h").Output() 先来看看 Go 创建运行一个进程大致流程: 将命令、参数,以及环境变量、要运行的工作目录等数据,传递给 `os.StartProce ...

Go 中的栈

之前在尝试阅读 Go runtime 代码的时候,看到有些函数是需要使用 systemstack 进行执行调用的,例如 runtime 中的监控逻辑 sysmon: systemstack(func() { newm(sysmon, nil, -1) }) Go 中关于 systemstack 的注释也非常简洁明了: // systemstac ...

Go 编译器 SSA 中间代码探究

Go 版本:1.15.6 起因 前一段时间,在某个 Go 交流学习群里有一个群友发出下面两段特殊的代码: 代码段 1 : package main import "time" func main() { var i = 1 go func() { time.Sleep(1*time.Second) println(i) }() i = 2 f ...

从一次线上问题排查发现的 fasthttp 设置问题

近期由于新上的一个系统新版本出现了 bug,现象是某个 HTTP 接口会在接受一定量请求之后 hang 住,伴随着产生了大量调用方的超时报警。由于新上的系统不是面向用户的系统,所以要求运维保留现场,关掉了触发问题请求的任务,开始排查问题。 最后找到问题的原因很简单:sqlx 库使用了 Queryx 方法,查询由于只是判断记录是否存在,所以并没有读取返回的 Rows,这就导致了一个问题,就 ...

从 Go 在 macOS 下的一个小问题说起

Go 版本:1.14.4 macOS 版本:10.15.5 从一段代码说起 请看下面 Go 代码: package main import ( "fmt" "time" ) func main() { fmt.Println(time.Now().UnixNano()) fmt.Println(time.Now().UnixNano()) fmt.Pr ...

Go 反射

Go 自带 GC、反射机制,在内存中的数据结构必然会有额外的数据结构,来记录这些额外的信息。 初探端倪:buildin new 函数(内存分配器 runtime/malloc.go): alt text alt text new 一个变量的时候,实际上编译 ...