如何在Go语言中检测操作系统版本?

4
我正在编写一个REST API客户端,我想确定用户使用的操作系统以生成有用的用户代理字符串。这将使我能够(希望能够)做出关于未来应该支持哪些操作系统的好决策。
我想要做的是生成一个类似以下格式的字符串:
Linux/1.3.2 OR Darwin/1.3.2 OR Windows/1.3.2
它应该适用于Linux / Mac / Windows。
目前,我能够使用以下方法检索操作系统类型(例如:'linux' / 'windows' / 'darwin'):
runtime.GOOS

但是我找不到一种方法来获取操作系统的主要/次要/微小版本。


你为什么关心确切的操作系统版本? - Basile Starynkevitch
这是一个API客户端库,最终将被全球许多开发人员使用,因此我希望能够知道要支持/投资哪些操作系统版本。例如:也许我最终会拥有大量的Windows开发人员用户群,并希望扩展我的Windows客户端支持。 - rdegges
2个回答

4
根据在Go google group的广泛讨论,似乎没有可靠的解决方案。我仍建议您查看该讨论,因为有一些有用的想法可以从特定操作系统中提取一些信息。 P.S.浏览器不是通过User_Agent发送此信息吗?
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36

这是在API客户端库中使用的 - 所以我不能使用浏览器代理相关的东西 :( - rdegges

1
使用uname(用于uname(2)系统调用),这在像Linux和MacOSX这样的POSIX系统上应该是可用的。
我不理解为什么你需要如此精确的信息;顺便说一下,在Linux和可能的MacOSX上,这还不够,libc版本(当然,还有GO运行时)至少同样重要。
(如果你关心的话,你应该能在Windows上找到类似的东西)

大多数Posix系统将uname作为库例程而非系统调用(因此不在系统调用包中)。但是,可以使用cgo来调用uname(并且C.struct_utsname比Linux系统调用和golang.org/x/sys/unix包定义的syscall.Utsname更直接可用)。 - Dave C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接