为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Golang 查询 Windows 中的总物理内存

使用 Golang 查询 Windows 中的总物理内存

Go
浮云间 2021-10-11 18:53:22
尝试在 Windows 上使用 Go 获取总物理内存,但不确定要使用哪些包和调用哪些包。我相信这可以通过syscall. 也不想与 C 接口来做到这一点。
查看完整描述

1 回答

?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

位于https://golang.org/pkg/syscall/的 syscall 包的官方在线 godoc似乎记录了 Linux API,因此在线查找资源有些困难。


首先要做的是通过改变的值在Windows平台上,或在任何平台上运行godocGOOS和GOARCH。


例如,在 Linux shell 中运行的以下命令允许 godoc 相信它在 Windows 上运行,因此记录相应的文件:


export GOOS=windows

export GOARCH=amd64

godoc -http=:8080

在浏览器中访问http://localhost:8080/pkg/syscall/ 会显示 Windows 系统调用 API 文档。


快速搜索显示 MSDN 上的一个有趣功能,即GetPhysicallyInstalledSystemMemory(请参阅https://msdn.microsoft.com/en-us/library/windows/desktop/cc300158(v=vs.85).aspx)。


显然,Windows Go syscall 包中不存在此函数,因此无法直接调用它。


由于 MSDN 页面显示此功能存在kernel32.dll于此页面(https://github.com/golang/go/wiki/WindowsDLLs)给出的解决方案中,因此不涉及与 C 的接口。

将技术调整到此功能给我们以下代码:


//+build windows

package main


import (

    "fmt"

    "syscall"

    "unsafe"

)


func main() {

    var mod = syscall.NewLazyDLL("kernel32.dll")

    var proc = mod.NewProc("GetPhysicallyInstalledSystemMemory")

    var mem uint64


    ret, _, err := proc.Call(uintptr(unsafe.Pointer(&mem)))

    fmt.Printf("Ret: %d, err: %v, Physical memory: %d\n", ret, err, mem)

}

运行时,输出:


Ret: 1, err: L'opération a réussi., 物理内存: 16777216


该值以千字节为单位给出,因此除以 1048576 (1024*1024) 以获得以千兆字节为单位的值。


查看完整回答
反对 回复 2021-10-11
  • 1 回答
  • 0 关注
  • 154 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信