我正在为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 tidy
https://stackoverflow.com/questions/65165823
复制相似问题