Golang | Stdlib - runtime
Contents
- 了解 runtime 包中的的环境变量
- 了解 runtime 包中的基本函数及使用
1. 概述
Packages runtime
conatins operations that interact(相互影响、相互作用) with Go’s runtime system, such as functions to control goroutines. It also includes the low-level type information used by the reflect package.
包 runtime 包含了和 Go 的运行时系统
进行交互的一些操作,例如控制 go 程
的功能。它也包含了被反射包使用的低级别类型
信息。
Q: 何为 low-level type?
2. 环境变量
The following environment variables ($name or %name%, depending on the host operating system) control the run-time behavior of Go programs. The meanings and use may change from release to release.
以下环境变量决定了Go程序的具体运行时的表现。
2.1. GOGC
The GOGC variable sets the initial garbage collection target percentage. A collection is triggered(触发) when the ratio(比率) of freshly(新鲜的、新近的) allocated(分配) data to live(v. 活着) data remaining after the previous collection reaches this percentage. The default is GOGC=100. Setting GOGC=off disables(禁用) the garbage collector entirely. The runtime/debug package’s SetGCPercent function allows changing this percentage at run time. See https://golang.org/pkg/runtime/debug/#SetGCPercent.
GOGC
变量用于设置初始的垃圾收集目标的百分比。当新分配的数据与先前收集后剩余数据的实时比率达到此百分比时,会触发收集。
2.2. GODEBUG
The GODEBUG variable controls debugging variables within the runtime. It is a comma-separated(逗号分隔) list of name=val pairs setting these named variables:
GODEBUG
变量用于控制runtime内的调试变量。它是一个以逗号分隔的 name=val 对列表,用于设置这些命名变量。
|
|
2.3. GOMAXPROCS
The GOMAXPROCS variable limits the number of operating system threads that can execute user-level Go code simultaneously(同时). There is no limit to the number of threads that can be blocked in system calls on behalf(代表) of Go code; those do not count against the GOMAXPROCS limit. This package’s GOMAXPROCS function queries and changes the limit.
GOMAXPROCS
变量用于限制可以同时执行用户级Go代码的操作系统线程的数量
2.4. GOTRACEBACK
The GOTRACEBACK variable controls the amount of output generated when a Go program fails due to an unrecovered panic or an unexpected runtime condition.
GOTRACEBACK
变量控制错误导致的输出数量
2.5. GOARCH、GOOS、GOPATH、GOROOT
|
|
3. 基本函数
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4. 函数使用
4.1. Go 语言的函数调用信息
函数的调用信息是程序中比较重要运行期信息, 在很多场合都会用到(比如调试或日志)
- runtime 包的 runtime.Caller、runtime.Callers、runtime.FuncForPc 等几个函数提供了获取函数掉用者信息的方法. (Note: 获取函数调用信息都是从子节点到父节点追踪的一个过程)
4.1.1. runtime.Caller 用法
函数签名及释义:
|
|
关于 runtime.Caller 的 demo: 输出函数的栈帧调用信息
|
|
Note:
- skip=0 时,runtime.Caller 返回的调用信息为:当前文件(runtime.go)里的 main.funcCallerInfo 函数,以及所在的行号
- skip=1 时,runtime.Caller 返回的调用信息为:跳过 skip=0 时的调用,向上一级查找父节点的调用堆栈信息,即:当前文件(runtime.go)里的 main.main 函数,以及调用funcCallerInfo 函数所在的行号
- skip=2 时,调用函数是:proc.go 里的 runtime.main 函数
- skip=3 时,调用函数是:asm_amd64.s 里的 runtime.goexit (TEXT runtime·goexit(SB),NOSPLIT,$0-0)
由此可知:Go 的普通程序启动顺序如下:
- runtime.goexit 为真正的函数入口(并不是 runtime.main)
- 然后 runtime.goexit 调用 runtime.main 函数
- 最后 runtime.main 函数调用用户编写 main.main 函数
4.1.2. runtime.Callers 用法
函数签名及释义:
|
|
关于 runtime.Callers 的 demo: 用于输出每个栈帧的 pc 信息
|
|
Note:
- 输出新的 pc 长度和 skip 大小有逆相关性. skip = 0 为 runtime.Callers 自身的信息.
- 这个例子比前一个例子多输出了一个栈帧, 就是因为多了一个runtime.Callers栈帧的信息(前一个例子是没有runtime.Caller信息的(注意:没有s后缀)).
4.1.3. runtime.FuncForPC 用法
函数签名如下:
|
|
关于 runtime.FuncForPC 的 demo:
|
|
Note: 根据测试, 如果是无效 pc (比如0), runtime.Func.FileLine 一般会输出当前函数的开始行号. 不过在实践中, 一般会用 runtime.Caller 获取文件名和行号信息, runtime.Func.FileLine 很少用到(如何独立获取pc参数?).
5. See Also
Thanks to the authors 🙂