Relatively new to Go. Seems trivial, but I can't figure out how to detect the OS version. I know I can use runtime.GOOS
and runtime.GOARCH
to get the platform and architecture, but say I know I'm on linux but I want to find if I'm on RH6 vice RH7, etc. is what I'm trying to figure out.
So there's this obscure Uname
method in the syscall
package that basically does it, at least on Linux. The struct it fills is a bit clunky and undocumented, but you can get the gist of it:
import (
"fmt"
"syscall"
)
// A utility to convert the values to proper strings.
func int8ToStr(arr []int8) string {
b := make([]byte, 0, len(arr))
for _, v := range arr {
if v == 0x00 {
break
}
b = append(b, byte(v))
}
return string(b)
}
func main() {
var uname syscall.Utsname
if err := syscall.Uname(&uname); err == nil {
// extract members:
// type Utsname struct {
// Sysname [65]int8
// Nodename [65]int8
// Release [65]int8
// Version [65]int8
// Machine [65]int8
// Domainname [65]int8
// }
fmt.Println(int8ToStr(uname.Sysname[:]),
int8ToStr(uname.Release[:]),
int8ToStr(uname.Version[:]))
}
}
BTW This doesn't work on the playground, probably because of the sandbox limitations, but works on Linux. Haven't tested other systems.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With