【问题标题】:How can I get a file's group ID (GID) in Go?如何在 Go 中获取文件的组 ID (GID)?
【发布时间】:2019-12-03 03:54:46
【问题描述】:

os.Stat() 返回一个FileInfo 对象,该对象有一个Sys() 方法,该方法返回一个没有方法的Interface{}。

虽然我可以fmt.Printf()它来“看到”“Gid”,但我无法以编程方式访问“Gid”。

如何在此处检索文件的“Gid”?

file_info, _ := os.Stat(abspath)
file_sys := file_info.Sys()
fmt.Printf("File Sys() is: %+v", file_sys)

打印:

File Sys() is: &{Dev:31 Ino:5031364 Nlink:1 Mode:33060 Uid:1616 Gid:31 X__pad0:0 Rdev:0 Size:32 Blksize:32768 Blocks:0 Atim:{Sec:1564005258 Nsec:862700000} Mtim:{Sec:1563993023 Nsec:892256000} Ctim:{Sec:1563993023 Nsec:893251000} X__unused:[0 0 0]}

注意:我不需要一个可移植的解决方案,它只需要在 Linux 上工作(值得注意的是,Sys() 已知是不稳定的)。

可能相关:Convert interface{} to map in Golang

【问题讨论】:

    标签: file go


    【解决方案1】:

    reflect 模块显示Sys() 返回的数据类型是*syscall.Stat_t,因此这似乎可以将文件的 Gid 作为字符串获取:

    file_info, _ := os.Stat(abspath)
    file_sys := file_info.Sys()
    file_gid := fmt.Sprint(file_sys.(*syscall.Stat_t).Gid)
    

    如果有更好的方法,请告诉我。

    【讨论】:

    • 这就是你可以做到的。如果有人在失败的平台上运行它,您可以使用特殊形式的类型断言:if stat, ok := file_sys.(*syscall.Stat_t); ok { fmt.Println(stat.Gid) }.
    • 或者您也可以直接调用syscall.Stat(),它会返回*syscall.Stat_t,但这并非在所有目标操作系统上都可用(例如在Window上)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-12
    • 2015-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多