不能通过golang获得Uname

时间:2015-04-02 14:48:08

标签: go system-calls uname

我在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

出了什么问题?

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:0)

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

我没有导入 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)