
Go 中可通过 os.FileMode.Perm() 提取权限位,并结合 fmt.Printf("%04o", mode.Perm()) 以标准四位八进制格式(如 0644、0755)输出文件权限。
go 中可通过 `os.filemode.perm()` 提取权限位,并结合 `fmt.printf("%04o", mode.perm())` 以标准四位八进制格式(如 0644、0755)输出文件权限。
在 Go 中,os.FileInfo.Mode() 返回的是一个 os.FileMode 类型值,它不仅包含文件类型(如普通文件、目录、符号链接、管道等),还内嵌了 Unix 风格的权限位(user/group/other 的 rwx)。但默认打印(如 fmt.Println(file.Mode()))显示的是字符串形式(如 -rw-r--r--),若需与 Unix/Linux 命令(如 ls -l 或 chmod)中常见的八进制权限表示(如 0644、0755)对齐,则必须显式提取纯权限位并格式化为八进制。
关键步骤如下:
-
调用
.Perm()方法:file.Mode().Perm()会屏蔽掉文件类型标志(如os.ModeDir、os.ModeSymlink等),仅保留低 9 位权限位(即 user/group/other 的 rwx),返回一个仍为os.FileMode类型但语义上等价于uint32的值; -
使用
%04o格式化:%o表示八进制整数输出,04指定最小宽度为 4 且左补零——这恰好匹配 Unix 权限的四位八进制惯例(首位0表示八进制字面量,后三位对应 ugo 权限)。
以下是一个完整可运行示例:
package main
import (
"fmt"
"io/ioutil"
"os"
)
func main() {
files, err := ioutil.ReadDir(".")
if err != nil {
panic(err)
}
fmt.Println("Name\tString Mode\tOctal Perm")
fmt.Println("----\t-----------\t----------")
for _, file := range files {
mode := file.Mode()
perm := mode.Perm() // 提取纯权限位(去掉目录、链接等类型标志)
fmt.Printf("%s\t%v\t\t%04o\n", file.Name(), mode, perm)
}
}运行后可能输出:
Name String Mode Octal Perm ---- ----------- ---------- main.go -rw-r--r-- 0644 bin drwxr-xr-x 0755 config -rwxr-xr-x 0755 README -rw-rw-r-- 0664
⚠️ 注意事项:
-
file.Mode().Perm()不会改变原始FileMode的文件类型信息,它只是安全地“过滤”出权限部分,因此可放心用于权限判断或格式化; - 若需将八进制权限转为
int进行位运算(如检查是否可执行:perm&0111 != 0),可直接对perm做类型断言或利用其底层uint32特性(uint32(perm)); -
ioutil.ReadDir在 Go 1.16+ 中已弃用,推荐改用os.ReadDir(".")(返回[]fs.DirEntry),此时需先调用.Info()获取FileInfo,再调用.Mode()—— 逻辑不变,仅 API 微调。
掌握 Perm() 与 %04o 的组合,即可在 Go 中精准、简洁、符合 Unix 习惯地呈现和处理文件权限。

















