【问题标题】:How Can I Detect the OS Version in Go?如何在 Go 中检测操作系统版本?
【发布时间】:2015-05-25 16:31:24
【问题描述】:

我目前正在编写一个 REST API 客户端,并且我正在尝试确定用户正在使用什么操作系统以生成有用的用户代理字符串。这将使我能够(希望)就我将来应该支持的操作系统做出正确的决定。

我想做的是:生成一个看起来像这样的字符串:

Linux/1.3.2 或 Darwin/1.3.2 或 Windows/1.3.2

它应该可以在 Linux / Mac / Windows 上运行。

目前,我可以使用

检索操作系统类型(例如:“linux”/“windows”/“darwin”)
runtime.GOOS

但我无法找到获取操作系统主要/次要/微型版本的方法。

【问题讨论】:

  • 为什么要关心确切的操作系统版本?
  • 这是一个 API 客户端库,将(最终)被全球许多开发人员使用,所以我想知道要支持/投资哪些操作系统版本。例如:也许我最终拥有庞大的 Windows 开发人员用户群,并希望扩展我的 Windows 客户端支持。

标签: linux windows macos go


【解决方案1】:

根据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 客户端库中使用的——所以我不能使用浏览器代理的东西 :(
【解决方案2】:

使用uname(用于uname(2) 系统调用),它应该在Linux 和MacOSX 等POSIX 系统上可用。

我不明白你为什么需要这么精确的信息;顺便说一句,在 Linux 上,可能还有 MacOSX 上,这还不够,libc(当然还有 GO 运行时)的版本至少同样重要。

(如果你关心的话,你应该为 Windows 找到类似的东西)

【讨论】:

  • 大多数 Posix 系统都将uname 作为库例程,而不是系统调用(因此不在系统调用包中)。但是,cgo 可以用来调用 uname(并且C.struct_utsname 比 Linux syscall 和 golang.org/x/sys/unix 包如何定义 syscall.Utsname 更直接可用)。
猜你喜欢
  • 2012-02-05
  • 1970-01-01
  • 1970-01-01
  • 2011-07-08
  • 2012-03-29
  • 2012-07-02
  • 2013-11-19
  • 2014-10-23
  • 2015-05-31
相关资源
最近更新 更多