+ 收藏我们

网站模板

网站模板搜索
404模板 营销型模板 外贸网站模板 单页模板 双语模板 标签大全
电话:18630701785
首页 > 站长学院 > 未定义:plan9 的 syscall.Stat_t >

未定义:plan9 的 syscall.Stat_t

时间:2024-04-09 09:47:51

大家好,今天本人给大家带来文章《未定义: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》的详细内容。

有问题可以加入网站技术QQ群一起交流学习

本站会员学习、解决问题QQ群(691961965)

客服微信号:lpf010888

Title