使用 wails
开发系统小工具的时候, 需要获取一些 系统的信息
,比如 CPU信息,内存信息等. psutil
是一个跨平台的进程与系统监控库,主要用于 Python 语言,而 gopsutil
则是其在 Go 语言中的实现版本,gopsutil
的基础用法做一个记录.
要做的 小工具. 如下图所示:
gopsutil 介绍
gopsutil
是 psutil
(一个常用于 Python 的系统和进程监控库)的 Go 实现版本。通过它,我们能够跨平台地获取系统相关的信息,且其 API 设计非常简洁易用,支持多种系统监控需求。
安装
首先,通过以下命令安装 gopsutil
:
1
| go get github.com/shirou/gopsutil
|
基本使用
CPU 信息
通过 gopsutil
,方便地获取 CPU 的相关信息。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| import "github.com/shirou/gopsutil/cpu"
func getCpuInfo() { cpuInfos, err := cpu.Info() if err != nil { fmt.Printf("获取 CPU 信息失败: %v", err) return } for _, ci := range cpuInfos { fmt.Println(ci) } for { percent, _ := cpu.Percent(time.Second, false) fmt.Printf("CPU 使用率: %v%%\n", percent) } }
|
此外, 还可以通过 gopsutil/load
获取 CPU 的负载信息:
1 2 3 4 5 6 7 8 9
| import "github.com/shirou/gopsutil/load"
func getCpuLoad() { loadInfo, _ := load.Avg() fmt.Printf("CPU 负载: %v\n", loadInfo) }
|
PS: gopsutil
将不同的功能划分到不同的子包中:
cpu
: CPU 相关
disk
: 磁盘相关
mem
: 内存相关
host
: 主机相关
- 其他还有
docker
, net
, process
, winservices
等
内存信息
通过 gopsutil/mem
可以获取系统的内存使用情况
1 2 3 4 5 6 7 8 9
| import "github.com/shirou/gopsutil/mem"
func getMemInfo() { memInfo, _ := mem.VirtualMemory() fmt.Printf("内存信息: %v\n", memInfo) }
|
主机信息
主机相关的信息也可以通过 gopsutil/host
进行查询,比如系统的启动时间、运行时间等。
1 2 3 4 5 6 7 8
| import "github.com/shirou/gopsutil/host"
func getHostInfo() { hostInfo, _ := host.Info() fmt.Printf("主机信息: %v\n系统运行时间: %v 秒\n系统启动时间: %v\n", hostInfo, hostInfo.Uptime, hostInfo.BootTime) }
|
磁盘信息
获取磁盘分区和使用情况。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| import "github.com/shirou/gopsutil/disk"
func getDiskInfo() { partitions, err := disk.Partitions(true) if err != nil { fmt.Printf("获取分区信息失败: %v\n", err) return } for _, partition := range partitions { fmt.Printf("分区: %v\n", partition) diskUsage, _ := disk.Usage(partition.Mountpoint) fmt.Printf("磁盘使用情况: 已用: %.2f%% 空闲: %v\n", diskUsage.UsedPercent, diskUsage.Free) }
ioCounters, _ := disk.IOCounters() for device, counter := range ioCounters { fmt.Printf("%v: %v\n", device, counter) } }
|
网络信息:
使用 gopsutil
获取网络 I/O 统计信息。
1 2 3 4 5 6 7 8 9
| import "github.com/shirou/gopsutil/net"
func getNetInfo() { netInfos, _ := net.IOCounters(true) for idx, netInfo := range netInfos { fmt.Printf("网络接口 %v: 发送字节: %v 接收字节: %v\n", idx, netInfo.BytesSent, netInfo.BytesRecv) } }
|
获取本地 IP:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| import "github.com/shirou/gopsutil/net"
func GetLocalIP() (string, error) { addrs, err := net.InterfaceAddrs() if err != nil { return "", err } for _, addr := range addrs { ipNet, ok := addr.(*net.IPNet) if !ok || ipNet.IP.IsLoopback() { continue } if ipNet.IP.IsGlobalUnicast() { return ipNet.IP.String(), nil } } return "", fmt.Errorf("未找到本地IP") }
|
Wails 托盘功能
由于 wails v2
版本没有支持 托盘的功能
, 所以 使用了 第三方的 库来做.
第三方库的地址是:
1
| https://github.com/getlantern/systray/tree/master
|
由于 2个 框架 不互通, 都调用了 系统的 扩展,尝试直接调用就会 报错,所以 在这里只能做一个 子程序运行
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| package main
import ( "fmt" "os/exec" )
func main() { cmd := exec.Command("echo", "子程序运行") output, err := cmd.Output()
if err != nil { fmt.Println("执行子程序时出错:", err) return }
fmt.Println("子程序输出:", string(output)) }
|
效果图如下:
最后
看到 walis v3
版本支持了 托盘功能, 就是不知道啥时候发布,希望尽快发布,这样就方便多了. 上面使用 systray
与 wails
需要解决很多的地方, 子程序与主程序之间的通信,这些.需要随时监控。等等