Interroger la mémoire physique totale sous Windows avec Golang
Essayer d'obtenir la mémoire physique totale à l'aide de Go sur Windows, mais vous ne savez pas quel (s) package (s) utiliser et quels appels effectuer. Je pense que cela peut être fait avec syscall
. Préfère également ne pas s'interfacer avec C pour ce faire.
Le godoc en ligne officiel du paquet syscall à l' adresse https://golang.org/pkg/syscall/ semble documenter les API Linux, il est donc quelque peu difficile de trouver les ressources en ligne.
La première chose à faire est d'exécuter godoc sur la plateforme Windows, ou sur n'importe quelle plateforme en modifiant les valeurs de GOOS
et GOARCH
.
Par exemple, les commandes suivantes exécutées dans un shell Linux permettent à godoc de croire qu'il fonctionne sous Windows, et donc de documenter les fichiers correspondants:
export GOOS=windows
export GOARCH=amd64
godoc -http=:8080
L'accès à http: // localhost: 8080 / pkg / syscall / dans un navigateur affiche la documentation de l'API Windows syscall.
Une recherche rapide révèle une fonction intéressante sur MSDN, à savoir GetPhysicallyInstalledSystemMemory
(voir https://msdn.microsoft.com/en-us/library/windows/desktop/cc300158(v=vs.85).aspx ).
Apparemment, cette fonction n'existe pas dans le package syscall de Windows Go, il n'est donc pas possible de l'appeler directement.
Puisque la page MSDN montre que cette fonction est présente dans kernel32.dll
une solution donnée par cette page ( https://github.com/golang/go/wiki/WindowsDLLs ) existe, cela n'implique pas d'interfaçage avec C.
Adapter la technique à cette fonction nous donne le code suivant:
//+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)
}
Lorsqu'il est exécuté, cela génère:
Ret: 1, err: L’opération a réussi., Physical memory: 16777216
La valeur est donnée en kilo-octets, donc divisez par 1048576 (1024 * 1024) pour obtenir une valeur en gigaoctets.