【问题标题】:Cannot get Uname by golang无法通过 golang 获取 Uname
【发布时间】:2015-06-07 13:59:04
【问题描述】:

我在 Mac 上使用 golang 1.4.2

我想使用Uname获取一些信息,以下是我的代码:

package main

import (
  "syscall"
)

func main() {
  utsname := syscall.Utsname{}
  syscall.Uname(&utsname)
}

但我收到了这些错误:

# command-line-arguments
./main.go:8: undefined: syscall.Utsname
./main.go:9: undefined: syscall.Uname

有什么问题吗?

【问题讨论】:

  • 看起来您并没有做错什么。你能通过运行go version 确保你的 Go 版本是 1.4.2 吗?
  • 检查go env,确保GOARCH和GOOS是正确的。
  • 我通过go version得到了go version go1.4.2 darwin/amd64
  • 买我的gorootGOROOT="/usr/local/Cellar/go/1.4/libexec"
  • my goroot 现在是 GOROOT="/usr/local/Cellar/go/1.4.2/libexec" 在打开一个新的终端选项卡后。但我仍然遇到同样的错误

标签: go system-calls uname


【解决方案1】:

(添加一个更直接的答案,说明我是如何解决这个问题的)

我没有导入syscall,而是导入了golang.org/x/sys/unix

然后,下面的代码块:

u := syscall.Utsname{}
syscall.Uname(&u)

替换为:

u := unix.Utsname{}
unix.Uname(&u)

注意!您需要为 Windows 调用相关函数。

git diff的相关内容:

-       "syscall"
+       "golang.org/x/sys/unix"

-       utsname := syscall.Utsname{}
-       syscall.Uname(&utsname)
+       utsname := unix.Utsname{}
+       unix.Uname(&utsname)

【讨论】:

    【解决方案2】:

    TL;DR UnameUtsname 不适用于 OSX。

    原因是这些函数没有为操作系统定义。

    阅读syscall 的文档让我大吃一惊:

    详细信息因底层系统而异,默认情况下,godoc 将显示当前系统的系统调用文档。如果您希望 godoc 显示另一个系统的系统调用文档,请将 $GOOS 和 $GOARCH 设置为所需的系统。

    在我的 Mac 上运行 godoc syscall 产生了 sycall 文档,其中不包括 Utsname 类型和 Uname 函数调用。

    但是,运行GOOS=linux GOARCH=amd64 godoc syscall 实际上会显示UtsnameUname

    另外,请注意,软件包本身已被锁定以支持特定于操作系统的软件包

    https://golang.org/pkg/syscall/ => https://godoc.org/golang.org/x/sys

    【讨论】:

      猜你喜欢
      • 2018-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-16
      • 2016-11-14
      • 2012-07-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多