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

时间:2015-06-09 21:22:19

标签: windows go

尝试使用Go on Windows获取总物理内存,但不确定要使用哪些软件包和调用make。我相信这可以通过syscall来完成。也不愿意与C接口来做到这一点。

1 个答案:

答案 0 :(得分:6)

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

首先要做的是通过更改GOOSGOARCH的值在Windows平台或任何平台上运行godoc。

例如,在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系统调用包中不存在此功能,因此无法直接调用它。

由于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,错误:L'opérationraéussi。,物理内存:16777216

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