大家好,今天本人给大家带来文章《未定义:plan9 的 syscall.Stat_t》,文中内容主要涉及到,如果你对golang方面的知识点感兴趣,那就请各位朋友继续看下去吧~希望能真正帮到你们,谢谢!
问题内容
我正在为 9front/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/ 下特定于操作系统的存储库。
如何针对 linux 和 plan9 实现 os.fileinfo.sys 的操作系统特定转换
解决方案
This answer 极大地帮助了我的研究。简而言之,虽然 syscall 代码库已被破坏并移至 golang.org/x/sys/ 下的操作系统特定包中,但我们仍然使用 syscall.xxx 语义来访问 golang.org/x/sys/ 中的结构:
对于 plan9,它是 Dir
var info os.fileinfo = ...
info.sys().(*syscall.dir)
对于 linux,它是 Stat_t
var info os.fileinfo = ...
info.sys().(*syscall.stat_t)
为了将上述发现放入解决方案中,我遵循@torek的建议并创建了两个文件,每个文件都有 func getxid(info os.fileinfo) (string, string) 函数和 // +build <os> 指令顶部:
file_details_plan9.go
// +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
}
file_details_unix.go
// +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
以上就是《未定义:plan9 的 syscall.Stat_t》的详细内容。