
在 Go 中,os.FileMode.Perm() 返回的是权限位的十进制整数(如 509),而 0775 是其对应的带前导零的八进制表示;可通过 fmt.Printf("%04o", perm) 直接格式化输出。
在 go 中,文件权限模式(`os.filemode`)底层是 `uint32` 类型,`.perm()` 方法提取其中的权限位后仍以十进制整数形式返回(例如 `0775` 八进制 = `509` 十进制)。若需以人类可读的八进制格式(如 `0775`)展示,不能直接使用整数打印,而应借助格式化动词进行进制转换。
要将权限值正确输出为带前导零的四位八进制字符串(如 0775),推荐使用 fmt.Printf 配合 %04o 格式动词:
package main
import (
"fmt"
"os"
)
func main() {
if len(os.Args) < 2 {
fmt.Println("Usage: ./main <file>")
return
}
f, err := os.Open(os.Args[1])
if err != nil {
panic(err)
}
defer f.Close()
info, err := f.Stat()
if err != nil {
panic(err)
}
perm := info.Mode().Perm()
fmt.Printf("Octal permission: %04o\n", perm) // 输出:0775
fmt.Printf("Decimal value: %d\n", perm) // 输出:509
}✅ 关键说明:
-
%o:以无前缀的八进制格式输出整数; -
%04o:输出至少 4 位,不足时左侧补0(即775→0775); - 不要误用
%#o(它会加前缀0,但长度不固定,如0775或075,不满足统一四位需求); -
Perm()仅提取用户/组/其他三组 rwx 权限位(即低 9 位),忽略 setuid/setgid/sticky 等特殊位,符合常规权限解析场景。
? 提示:若需进一步解析权限(如判断是否可执行、是否为目录),可结合位运算,例如 perm&0111 != 0 判断任意用户是否有执行权限。但对标准显示需求,%04o 是简洁、可靠且符合 Unix 习惯的解决方案。

















