Golang 跨平台获取系统信息实现指南

今天早睡
今天早睡
发布时间:2026-10-15| 4人浏览过
原创

通过引入 github.com/shirou/gopsutil 库,Golang 开发者能够轻松实现跨平台的系统资源监控。本文将演示如何使用该库统一接口获取 CPU 使用率、物理/虚拟内存状态、硬盘空间、运行时间及网络流量,并解决因 API 设计导致的内存使用率需手动计算的细节。

背景与编译策略

Golang 以跨平台著称,但在涉及底层系统调用(如 syscall 包)时,往往仍需针对特定操作系统进行适配。在处理复杂的系统信息获取需求时,与其编写大量基于构建标签的代码,不如直接使用成熟的第三方抽象库。

如果项目中确实需要区分系统编译,Golang 提供了两种方式:

  1. 构建注释:在源码文件头部添加 //go:build linux 或 // +build windows 来指定编译目标环境。
  2. 文件名后缀:直接通过文件名区分,例如将 Linux 特有的代码放入 ccall_linux.go,Windows 的放入 ccall_windows.go。这种方式的直观性更强,且符合 Go 语言的惯例。

核心库与数据获取

我们使用 github.com/shirou/gopsutil 及其子模块来获取各类硬件和系统指标。以下结构体定义了封装后的系统信息字段:

type LSysInfo struct {
	MemAll     uint64  // 总内存 (MB)
	MemFree    uint64  // 空闲内存 (MB)
	MemUsed    uint64  // 已用内存 (MB)
	MemUsedPercent float64 // 内存使用百分比
	Days       int64   // 运行天数
	Hours      int64   // 剩余小时数
	Minutes    int64   // 剩余分钟数
	Seconds    int64   // 剩余秒数
	CpuUsedPercent float64 // CPU 使用百分比
	OS         string  // 操作系统名称
	Arch       string  // 系统架构
	CpuCores   int     // CPU 核数
}

第1步:初始化与依赖导入

在 Go module 中引入必要的包。注意 mem 模块在不同版本路径可能不同(如 v3/mem),请根据实际安装的库版本调整 import 路径。

import (
	"fmt"
	"os"
	"runtime"
	"time"

	"github.com/shirou/gopsutil/cpu"
	"github.com/shirou/gopsutil/disk"
	"github.com/shirou/gopsutil/host"
	"github.com/shirou/gopsutil/net"
	"github.com/shirou/gopsutil/v3/mem" // 注意版本路径
)

第2步:获取并计算内存信息

调用 mem.VirtualMemory() 获取内存快照。需要注意的是,部分版本的 gopsutil 返回的使用率在不同 OS 上定义不一致,因此建议通过总内存和空闲内存手动计算使用率以保证准确性。

func GetSysInfo() (info LSysInfo) {
	unit := uint64(1024 * 1024) // 转换为 MB 单位

	v, err := mem.VirtualMemory()
	if err == nil {
		info.MemAll = v.Total / unit
		info.MemFree = v.Free / unit
		info.MemUsed = info.MemAll - info.MemFree
		// 手动计算百分比
		if info.MemAll != 0 {
			info.MemUsedPercent = float64(info.MemUsed) / float64(info.MemAll) * 100.0
		}
	}
	return info
}

第3步:获取 CPU 及网络基础数据

CPU 使用率必须指定采样时间间隔,否则无法准确反映当前负载。过短会导致误差,过长会影响程序响应速度(产生卡顿感)。推荐设置为 200ms 至 1s。

	// 获取 200ms 内的平均 CPU 使用率
	cc, err := cpu.Percent(time.Millisecond*200, false)
	if err == nil {
		info.CpuUsedPercent = cc[0]
	}

	// 获取其他基本属性
	info.OS = runtime.GOOS
	info.Arch = runtime.GOARCH
	info.CpuCores = runtime.GOMAXPROCS(0)

	// 网络流量统计
	nv, _ := net.IOCounters(true)
	fmt.Printf("Network RX/TX: %v bytes / %v bytes\n", nv[0].BytesRecv, nv[0].BytesSent)

第4步:计算系统运行时间

通过 host.BootTime() 获取开机时间戳,并与当前时间相减,换算为天、时、分、秒。

	boottime, _ := host.BootTime()
	currentSec := time.Now().Unix()
	bootSec := int64(boottime)
	deltaSec := currentSec - bootSec

	info.Days = deltaSec / 86400
	info.Hours = (deltaSec % 86400) / 3600
	info.Minutes = (deltaSec % 3600) / 60
	info.Seconds = deltaSec % 60

结果验证与注意事项

在不同平台上测试结果如下所示。请注意 Windows 和 Linux 在显示主机名、平台和具体硬件型号上的差异。

Windows 输出示例:

CPU: Intel(R) Core(TM) i5-4210M @ 2.60GHz (4 cores)
Physical Count: 2, Logical Count: 4
HD Usage: 90.2% | Free: 32 GB
OS: Microsoft Windows 7 Ultimate (amd64)
Uptime: 0d 9h 26m 6s

Linux 服务器输出示例:

CPU: Intel(R) Xeon(R) E5-2640 v4 @ 2.40GHz (20 cores)
HD Usage: 16.7% | Free: 38 GB
OS: CentOS 7 (amd64)
Uptime: 0d 1h 6m 38s

关键注意点:

  • 磁盘路径:获取磁盘使用时,Windows 需要指定盘符(如 "C:\"),Linux 通常使用根目录 "/"。
  • CPU 精度:cpu.Percent 的返回值数组长度取决于逻辑核数还是物理核,视版本而定,访问 cc[0] 时需注意是否越界或对应关系。
  • 单位换算:Gopsutil 返回内存通常为字节(Byte),业务展示常需除以 1024^2 转换为 MB。

以上就是 Golang 使用 gopsutil 获取系统信息的详细内容,更多关于 Golang 跨平台监控的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。