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 版本和平台信息
如有疑问关注公众号给我留言
wx

关注公众号

©2017-2023 鲁ICP备17023316号-1 Powered by Hugo