$ uname -m
x86_64
みたいなやつ。
syscall.Uname()
でsyscall.Utsname
を取得し、そのうちのMachine
を文字列として取得する。
main.go
package main
import (
"fmt"
"os"
"syscall"
)
func main() {
m, err := machine()
if err != nil {
fmt.Println(err.Error())
os.Exit(1)
}
fmt.Println(m)
os.Exit(0)
}
func machine() (string, error) {
u := syscall.Utsname{}
err := syscall.Uname(&u)
if err != nil {
return "", err
}
var m string
for _, val := range u.Machine {
m += string(int(val))
}
return m, nil
}
なおsyscall.Uname
およびsyscall.Utsname
の実装はOSに依存しており、Linuxでは動くけどWindowsやOSX、BSDなどではそもそもこのコードのビルドが通らない。
なので複数OSを前提としたコードを書くなら、syscall.Uname
やsyscall.Utsname
を呼び出す部分はOSごとにファイルを切り分けるなのの必要が出てくる。
参考
- Package syscall
- Int array to string #golang
- Build constraintsの"If a file's name,〜"のあたり