runtime 包基本用法
runtime 包提供了与 Go 运行时系统交互的操作。
Goroutine 和 CPU
package main
import (
"fmt"
"runtime"
)
func main() {
// 获取当前 goroutine 数量
fmt.Printf("Goroutines: %d\n", runtime.NumGoroutine())
// 获取逻辑 CPU 数量
fmt.Printf("CPU 数量: %d\n", runtime.NumCPU())
// 设置使用的最大 CPU 数量
runtime.GOMAXPROCS(runtime.NumCPU())
fmt.Printf("GOMAXPROCS: %d\n", runtime.GOMAXPROCS(0))
}
内存统计
package main
import (
"fmt"
"runtime"
)
func main() {
var m runtime.MemStats
// 强制垃圾回收
runtime.GC()
// 读取内存统计
runtime.ReadMemStats(&m)
fmt.Printf("已分配内存: %d KB\n", m.Alloc/1024)
fmt.Printf("总分配内存: %d KB\n", m.TotalAlloc/1024)
fmt.Printf("堆内存: %d KB\n", m.HeapAlloc/1024)
fmt.Printf("堆系统内存: %d KB\n", m.HeapSys/1024)
fmt.Printf("垃圾回收次数: %d\n", m.NumGC)
}
获取调用信息
package main
import (
"fmt"
"runtime"
)
func main() {
// 获取调用者信息
pc, file, line, ok := runtime.Caller(0)
if ok {
fn := runtime.FuncForPC(pc)
fmt.Printf("函数: %s\n", fn.Name())
fmt.Printf("文件: %s\n", file)
fmt.Printf("行号: %d\n", line)
}
// 打印调用栈
fmt.Println("\n调用栈:")
printStack()
}
func printStack() {
buf := make([]byte, 4096)
n := runtime.Stack(buf, false)
fmt.Println(string(buf[:n]))
}
设置_finalizer
package main
import (
"fmt"
"runtime"
"time"
)
type Resource struct {
name string
}
func main() {
r := &Resource{name: "重要资源"}
// 设置 finalizer
runtime.SetFinalizer(r, func(r *Resource) {
fmt.Printf("资源 %s 被回收\n", r.name)
})
// 解除引用
r = nil
// 强制垃圾回收
runtime.GC()
// 等待 finalizer 执行
time.Sleep(time.Second)
}
版本信息
package main
import (
"fmt"
"runtime"
)
func main() {
// Go 版本
fmt.Printf("Go 版本: %s\n", runtime.Version())
// 操作系统和架构
fmt.Printf("操作系统: %s\n", runtime.GOOS)
fmt.Printf("架构: %s\n", runtime.GOARCH)
// 编译器
fmt.Printf("编译器: %s\n", runtime.Compiler)
}
总结
| 功能 | 函数 | 说明 |
|---|---|---|
| Goroutine | NumGoroutine() |
获取当前 goroutine 数量 |
| CPU | NumCPU(), GOMAXPROCS() |
CPU 相关操作 |
| 内存 | ReadMemStats() |
读取内存统计 |
| GC | GC() |
强制垃圾回收 |
| 调试 | Caller(), Stack() |
获取调用信息 |
| 版本 | Version(), GOOS, GOARCH |
版本和平台信息 |