ホームページ  >  記事  >  バックエンド開発  >  Go の os.FileMode で権限値を正しく変換する方法

Go の os.FileMode で権限値を正しく変換する方法

Barbara Streisand
Barbara Streisandオリジナル
2024-10-24 18:26:02709ブラウズ

How to Correctly Convert Permission Values in os.FileMode for Go

Go の os.FileMode 関数について: 整数からのアクセス許可の変換

Go の os.FileMode 関数を使用すると、開発者はファイル アクセス許可フラグを設定できます。ただし、整数、8 進数、その他の形式からのパーミッション変換をどのように処理するかについて疑問が生じています。

当初は 10 進値と 8 進数値に関連するパーミッションのバグとして報告されましたが、根本的な問題は入力の基本フォーマットに起因しています。番号。 Go は、プレフィックスや書式設定に関係なく、os.FileMode へのすべての入力を整数として扱います。

明確にするために、os.FileMode(700) を呼び出しても 8 進数解釈は行われませんが、整数値 700 が保持されます。 '--w-rwxr--' 権限 (8 進数で 274) の場合、実際の結果は '--w-r-xr--' (8 進数で 254) になります。

これに対処するには、常に次のように整数を指定します。 8 進数の値にプレフィックス 0 を付けます。以下の例では、os.FileMode(0700) は、期待どおりにアクセス許可を正しく設定します: '-rwx------' (8 進数の 700)。

または、次のコードを使用して、10 進数値 700 を 8 進数値に手動で変換します:

<code class="go">mode := uint(0) // 0 is the octal separator
mode |= 1 << 6 // read permission for owner
mode |= 1 << 5 // write permission for owner
mode |= 1 << 3 // execute permission for owner

fmt.Println(os.FileMode(mode).String()) // Output: -rwx------</code>

Go ドキュメントでは、FileMode タイプが uint32 であり、LSB の 9 ビットがファイルのアクセス許可を表し、上位 12 ビットが特殊なファイル機能を示していることが強調されています。 。 os.FileMode で先頭の 8 進数区切り文字を使用せずに 10 進値を使用すると、基本解釈により予期しない動作が発生する可能性があります。

したがって、混乱を避け、適切な権限設定を確保するには、常に次のガイドラインに従ってください:

  • os.FileMode への入力を整数として扱い、8 進数区切り文字プレフィックスのない 10 進数の使用を避けます。
  • 8 進数のアクセス許可値を指定するには、os.FileMode(0700) または同等の整数から 8 進数への変換メソッドを使用します。

以上がGo の os.FileMode で権限値を正しく変換する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。