
本文介绍如何在 Go 中跨平台获取主机名、操作系统平台、CPU 型号、内存总量和磁盘容量等关键系统信息,推荐使用成熟的第三方库 gopsutil,并提供 Windows 下可运行的完整示例与常见问题解决方案。
本文介绍如何在 go 中跨平台获取主机名、操作系统平台、cpu 型号、内存总量和磁盘容量等关键系统信息,推荐使用成熟的第三方库 `gopsutil`,并提供 windows 下可运行的完整示例与常见问题解决方案。
在 Go 生态中,标准库未内置类似 Python psutil 的系统监控能力,但社区提供了功能完备、跨平台支持良好的替代方案——github.com/shirou/gopsutil。该库封装了 Windows WMI、Linux /proc 与 sysfs、macOS host_info 等底层接口,支持 CPU、内存、磁盘、网络、进程、主机信息等多维度数据采集,是生产环境首选。
✅ 快速开始:安装与依赖
执行以下命令安装核心库(注意:gopsutil 已迁移至 github.com/shirou/gopsutil/v3,但 v2 仍广泛兼容;本文以稳定易用的 v2 为例):
go get github.com/shirou/gopsutil/v2
⚠️ Windows 用户特别注意:gopsutil 在 Windows 上依赖 WMI 查询,需额外安装 WMI 支持包(尤其在较新 Go 版本或 MinGW 环境下):
go get github.com/StackExchange/wmi若遇到 no buildable Go source files 错误(如原提问中的 github.com/golang/sys 报错),通常因误用了已废弃或不匹配的仓库路径——请严格使用 github.com/shirou/gopsutil/v2,而非 golang/sys。
? 核心代码示例(Windows 兼容,含注释)
以下是一个结构清晰、可直接运行的完整程序,用于获取主机名、平台标识、CPU 型号、总内存(MB)和系统盘总容量(MB):
package main
import (
"fmt"
"runtime"
"github.com/shirou/gopsutil/v2/cpu"
"github.com/shirou/gopsutil/v2/disk"
"github.com/shirou/gopsutil/v2/host"
"github.com/shirou/gopsutil/v2/mem"
)
// SysInfo 封装基础系统指标,便于序列化或扩展
type SysInfo struct {
Hostname string `json:"hostname"`
Platform string `json:"platform"`
OS string `json:"os"`
Arch string `json:"arch"`
CPU string `json:"cpu_model"`
RAMMB uint64 `json:"ram_mb"`
DiskMB uint64 `json:"disk_mb"`
}
func main() {
// 获取主机信息(含 hostname, platform, os, uptime 等)
hostStat, err := host.Info()
if err != nil {
panic("failed to get host info: " + err.Error())
}
// 获取 CPU 信息(返回切片,多核时包含多个条目;取首核型号即可)
cpuStats, err := cpu.Info()
if err != nil {
panic("failed to get cpu info: " + err.Error())
}
// 获取虚拟内存(即物理内存)统计
vmStat, err := mem.VirtualMemory()
if err != nil {
panic("failed to get memory info: " + err.Error())
}
// 获取磁盘使用情况:Windows 用 `"\ "` 表示系统盘(C:),Linux/macOS 用 `"/"`
rootPath := "\"
if runtime.GOOS == "linux" || runtime.GOOS == "darwin" {
rootPath = "/"
}
diskStat, err := disk.Usage(rootPath)
if err != nil {
panic("failed to get disk usage: " + err.Error())
}
// 构建结果
info := SysInfo{
Hostname: hostStat.Hostname,
Platform: hostStat.Platform,
OS: hostStat.OS,
Arch: runtime.GOARCH,
CPU: cpuStats[0].ModelName,
RAMMB: vmStat.Total / 1024 / 1024,
DiskMB: diskStat.Total / 1024 / 1024,
}
fmt.Printf("System Info:
%+v
", info)
}? 输出示例(Windows)
System Info:
{Hostname:"DESKTOP-ABC123" Platform:"windows" OS:"Microsoft Windows 11 Pro" Arch:"amd64" CPU:"Intel(R) Core(TM) i7-10870H CPU @ 2.20GHz" RAMMB:0x100000000 DiskMB:0x258000000}? 提示:RAMMB 和 DiskMB 为 uint64 类型,输出中 0x... 是 fmt.Printf("%+v") 对整数的十六进制显示;若需十进制,改用 fmt.Printf("RAM: %d MB ", info.RAMMB) 即可。
⚙️ 注意事项与最佳实践
- 错误处理不可省略:示例中为简洁展示使用 panic,生产环境应采用 if err != nil { log.Fatal(err) } 或更细粒度的错误分类处理。
- 跨平台路径适配:磁盘根路径("\ " vs "/")必须按 runtime.GOOS 动态判断,否则在非 Windows 系统将报错。
- 性能考量:cpu.Info()、host.Info() 等调用涉及系统调用,不宜高频轮询;如需实时监控,建议结合 time.Ticker 控制采样频率(如 5s 一次)。
- 权限要求:Windows 下部分信息(如进程列表)需管理员权限;Linux 下某些字段(如 host.Uptime())可能需要 CAP_SYS_ADMIN,但基础信息通常无需特殊权限。
- 版本升级建议:gopsutil/v3 提供了更规范的模块划分(如 cpu.CPUInfo() 替代 cpu.Info())和 Context 支持,新项目推荐直接使用 v3 并查阅其 官方文档。
通过 gopsutil,Go 开发者可以高效、可靠地集成系统级可观测能力,无论是构建运维工具、资源调度器,还是嵌入式设备诊断模块,都具备坚实基础。










