Как я могу определить версию ОС в Go - PullRequest
0 голосов
/ 07 ноября 2018

Относительно новый для Go. Кажется тривиальным, но я не могу понять, как определить версию ОС. Я знаю, что могу использовать runtime.GOOS и runtime.GOARCH для получения платформы и архитектуры, но, скажем, я знаю, что я нахожусь на Linux, но я хочу узнать, нахожусь ли я на RH6, т. Е. RH7 и т. Д. - это то, что я пытаюсь выяснить.

1 Ответ

0 голосов
/ 08 ноября 2018

Итак, в пакете syscall есть этот неясный Uname метод, который в основном делает это, по крайней мере, в Linux. Структура, которую он заполняет, немного неуклюжа и недокументирована, но вы можете понять ее суть:

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[:]))

    }
}

Кстати, это не работает на игровой площадке, возможно, из-за ограничений песочницы, но работает на Linux. Не тестировал другие системы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...