go语言windows下进程信息获取实现方式
在Windows平台下,首先使用Go语言的syscall.GetProcessTimes获取当前进程的详细时间信息,继而通过gopsutil枚举所有进程,再调用OpenProcess获得句柄,即可获取任意进程的创建、退出、内核时间与用户时间并转换为纳秒时长,适用于进程性能分析与监控。
一、获取当前进程时间信息
在 Windows 平台下开发时,经常需要拿到进程的创建时间、退出时间、内核态时间和用户态时间。Go 语言标准库中的 syscall 包已经封装了对应的系统调用,直接调用 GetProcessTimes 就能拿到这些数据。操作很简单:先通过 syscall.GetCurrentProcess() 拿到当前进程的句柄,然后调用 GetProcessTimes 把结果填充到四个 Filetime 结构体里。最后用 Nanoseconds() 转成纳秒,方便打印或计算。下面这段代码就是完整的实现示例:
import (
"syscall"
"fmt"
)
var (
creationTime syscall.Filetime
exitTime syscall.Filetime
kernelTime syscall.Filetime
userTime syscall.Filetime
)
h, err := syscall.GetCurrentProcess()
if err != nil {
fmt.Println(err)
return
}
err = syscall.GetProcessTimes(h, &creationTime, &exitTime, &kernelTime, &userTime)
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("CreationTime: %v\nExitTime: %v\nKernelTime: %v\nUserTime: %v\n", creationTime.Nanoseconds(), exitTime.Nanoseconds(), kernelTime.Nanoseconds(), userTime.Nanoseconds())
细心的读者可能会问:那如果我想获取其他进程的时间信息呢?别急,第二步就是讲这个。
二、获取进程id
要获取任意进程的时间信息,第一步得先拿到进程的 PID。常用的方法有两种:一是当前进程直接用 syscall.Getpid();二是系统所有进程,推荐用 gopsutil/process 这个第三方库,它封装了跨平台的进程枚举逻辑。
拿到 PIDs 列表后,可以遍历每个 PID,通过 process.NewProcess(pid) 创建一个进程对象,然后用 pn.Name() 获取进程名。如果想针对特定进程(比如 main.exe)做过滤,就在循环里做个字符串比较。确认目标后,调用 syscall.OpenProcess 打开进程句柄(注意权限要足够),接着复用刚才的 GetProcessTimes 获取时间信息。最后记得关闭句柄。
下面这段代码演示了如何枚举所有进程,筛选出名为 main.exe 的进程,并打印它的 PID 以及创建时间的毫秒数:
import (
"fmt"
"strings"
"syscall"
"time"
"github.com/shirou/gopsutil/process"
)
// 获取当前进程pid
pid := syscall.Getpid()
fmt.Println("mypid:", pid)
// 获取系统所有进程id
pids, _ := process.Pids()
for _, pid := range pids {
// 根据进程id实例化每个进程
pn, _ := process.NewProcess(pid)
pName, _ := pn.Name()
// 过滤进程名为main.exe的进程信息
if 0 != strings.Compare(pName, "main.exe") {
continue
}
// 获取进程所在路径
_, _ = pn.Cwd()
h, err := syscall.OpenProcess(syscall.STANDARD_RIGHTS_REQUIRED|syscall.SYNCHRONIZE|0xfff, false, uint32(pid))
if err != nil {
fmt.Println(err)
return
}
defer syscall.CloseHandle(h)
err = syscall.GetProcessTimes(h, &creationTime, &exitTime, &kernelTime, &userTime)
if err != nil {
fmt.Println(err)
return
}
fmt.Println("pid:", pid, ",milliseconds:", creationTime.Nanoseconds()/1000000)
}
_, err = process.Processes()
if err != nil {
fmt.Println(err.Error())
return
}
总结
在 Windows 下用 Go 获取进程时间信息,核心就是 syscall.GetProcessTimes 这个函数。对于当前进程,直接获取句柄调用即可;对于其他进程,则需要先通过进程名或 PID 拿到句柄,再执行同样的操作。配合 gopsutil 库做进程枚举,几乎可以覆盖所有常见的监控需求。如果你的项目中需要记录进程启动时间、CPU 耗时或者崩溃时刻,这个方案足够轻量且高效。

Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。
Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。
Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。
Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。















