0

我正在为 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/.

  • 如何os.FileInfo.Sys为 Linux 和 Plan9实现特定于操作系统的转换
4

1 回答 1

1

这个答案极大地帮助了我的研究。简而言之,虽然syscall代码库被破坏并移动到特定于操作系统的包中golang.org/x/sys/,但我们仍然使用syscall.xxx语义来访问以下结构golang.org/x/sys/

  • 对于 Plan9,它是Dir
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>

  • 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
}

注意:似乎golang.org/x/sys/plan9标准 Go 安装中缺少该包,需要显式安装:

go get golang.org/x/sys/plan9
go mod vendor
go mod tidy
于 2020-12-08T06:30:35.953 回答