我正在为9前台/ Plan9开发一个文件管理器;开发工作是在64位Ubuntu下的Go v1.15中完成的,通过交叉编译来构建Plan9二进制文件。
让我们假设一个函数来检索用户/组信息:
import "syscall"
func GetXid(info os.FileInfo) (string, string) {
UID := "N/A"
GID := "N/A"
if stat, ok := info.Sys().(*syscall.Stat_t); ok {
UID = strconv.Itoa(int(stat.Uid))
GID = strconv.Itoa(int(stat.Gid))
}
return UID, GID
}它在用Plan9编译undefined: syscall.Stat_t时失败。
syscall 包页表示,从Go v1.4开始,就不再推荐它了,并在golang.org/x/sys/下用操作系统特定的repos替换了它。
发布于 2020-12-08 06:30:35
这个答案极大地帮助了我的研究。简单地说,虽然syscall代码库被破坏并移动到golang.org/x/sys/下的操作系统特定的包中,但我们仍然使用syscall.xxx语义从golang.org/x/sys/访问结构。
var info os.FileInfo = ...
info.Sys().(*syscall.Dir)var info os.FileInfo = ...
info.Sys().(*syscall.Stat_t)为了将上述发现应用到解决方案中,我遵循@torek建议并创建了两个文件,每个文件顶部都有func GetXid(info os.FileInfo) (string, string)函数和// +build <os>指令:
// +build plan9
package model
import (
"syscall"
"os"
)
func GetXid(info os.FileInfo) (string, string) {
UID := "N/A"
GID := "N/A"
if stat, ok := info.Sys().(*syscall.Dir); ok {
UID = stat.Uid
GID = stat.Gid
}
return UID, GID
}// +build linux
package model
import (
"os"
"strconv"
"syscall"
)
func GetXid(info os.FileInfo) (string, string) {
UID := "N/A"
GID := "N/A"
if stat, ok := info.Sys().(*syscall.Stat_t); ok {
UID = strconv.Itoa(int(stat.Uid))
GID = strconv.Itoa(int(stat.Gid))
}
return UID, GID
}注意:还显示标准Go安装中缺少包golang.org/x/sys/plan9,需要显式安装:
go get golang.org/x/sys/plan9
go mod vendor
go mod tidyhttps://stackoverflow.com/questions/65165823
复制相似问题