STDIN 上の入力の存在に基づいて、コマンド ライン ツールの動作が異なるようにしたいとします。ただし、ioutil.ReadAll(os.Stdin) を直接使用すると、予期しない動作が発生する可能性があります。
特に、STDIN 入力なしでツールが呼び出された場合、プログラムは入力を無期限に待機し、処理を続行できなくなります。
この問題を解決するには、os.Stdin.Stat() を利用して、 STDIN ファイル記述子はキャラクタ デバイスです。次のコード スニペットは、これを実現する方法を示しています。
package main import ( "fmt" "os" ) func main() { stat, _ := os.Stdin.Stat() if (stat.Mode() & os.ModeCharDevice) == 0 { fmt.Println("data is being piped to stdin") } else { fmt.Println("stdin is from a terminal") } }
STDIN ファイルの ModeCharDevice フラグがクリアされると、データが STDIN にパイプされていることを示します。それ以外の場合は、STDIN が端末に接続されていることを示します。このフラグをチェックすることで、プログラムをブロックすることなく、STDIN に読み取るものがあるかどうかを判断できます。
以上がGo でブロックせずに STDIN 上の読み取り可能なコンテンツを検出するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。