无法通过 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
买我的goroot
是GOROOT="/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 Uname
和 Utsname
不适用于 OSX。
原因是这些函数没有为操作系统定义。
阅读syscall
的文档让我大吃一惊:
详细信息因底层系统而异,默认情况下,godoc 将显示当前系统的系统调用文档。如果您希望 godoc 显示另一个系统的系统调用文档,请将 $GOOS 和 $GOARCH 设置为所需的系统。
在我的 Mac 上运行 godoc syscall
产生了 sycall
文档,其中不包括 Utsname
类型和 Uname
函数调用。
但是,运行GOOS=linux GOARCH=amd64 godoc syscall
实际上会显示Utsname
和Uname
。
另外,请注意,软件包本身已被锁定以支持特定于操作系统的软件包
https://golang.org/pkg/syscall/ => https://godoc.org/golang.org/x/sys
【讨论】:
以上是关于无法通过 golang 获取 Uname的主要内容,如果未能解决你的问题,请参考以下文章
调试golang可执行文件时无法在vscode中获取局部变量