无法通过 golang 获取 Uname

Posted

技术标签:

【中文标题】无法通过 golang 获取 Uname【英文标题】:Cannot get Uname by golang 【发布时间】: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" 在打开一个新的终端选项卡后。但我仍然遇到同样的错误 【参考方案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

【讨论】:

以上是关于无法通过 golang 获取 Uname的主要内容,如果未能解决你的问题,请参考以下文章

调试golang可执行文件时无法在vscode中获取局部变量

golang Golang通过反射获取结构体的标签

golang获取一年所有周日的

golang内存扩容

在go modules中使用replace替换无法直接获取的package(golang.org/x/...)

golang获取命令行参数