Go中定义文件权限常量应使用自定义类型FileMode封装iota,显式声明权限位(如OwnerRead=1<<(9-1))及组合常量(如PermRWX=PermRead|PermWrite|PermExec),确保类型安全和位运算正确性。

<p>在 Go 中,用 <code>iota</code> 定义文件权限常量时,需兼顾位运算语义和类型安全——推荐使用自定义整数类型(如 <code>FileMode</code>)封装,并让常量显式属于该类型。</p>
<H3>定义类型安全的权限类型</H3>
<p>避免直接用 <code>int</code> 或 <code>uint32</code>,而是声明专属类型,确保编译期类型检查:</p>
<font color="#888">
<pre><code>type FileMode uint32</code></pre>
</font>
<H3>用 iota 枚举标准 Unix 权限位</H3>
<p>每个常量代表一个独立的权限位(非连续数值),便于按位组合(如 <code>OwnerRead | GroupWrite</code>):</p>
<font color="#888">
<pre><code>const (
OwnerRead FileMode = 1 << (9 - 1) // 0400
OwnerWrite FileMode = 1 << (9 - 2) // 0200
OwnerExec FileMode = 1 << (9 - 3) // 0100
GroupRead FileMode = 1 << (9 - 4) // 0040
GroupWrite FileMode = 1 << (9 - 5) // 0020
GroupExec FileMode = 1 << (9 - 6) // 0010
OtherRead FileMode = 1 << (9 - 7) // 0004
OtherWrite FileMode = 1 << (9 - 8) // 0002
OtherExec FileMode = 1 << (9 - 9) // 0001
)</code></pre>
</font>
<H3>补充常用组合常量(保持类型一致)</H3>
<p>组合值也必须是 <code>FileMode</code> 类型,防止混入裸整数:</p>
<font color="#888">
<pre><code>const (
PermRead FileMode = OwnerRead | GroupRead | OtherRead // 0444
PermWrite FileMode = OwnerWrite | GroupWrite | OtherWrite // 0222
PermExec FileMode = OwnerExec | GroupExec | OtherExec // 0111
PermRWX FileMode = PermRead | PermWrite | PermExec // 0777
PermRW FileMode = PermRead | PermWrite // 0666
)</code></pre>
</font>
<H3>使用示例与类型安全验证</H3>
<p>这样定义后,编译器会拒绝非法赋值,例如:</p>
<font color="#888">
<pre><code>var m FileMode = OwnerRead | GroupWrite // ✅ 正确:同类型按位或
var n int = OwnerRead // ❌ 编译错误:不能把 FileMode 赋给 int
os.Chmod("file", OwnerRead|OwnerWrite) // ✅ 传入 FileMode,类型安全</code></pre>
</font>