コマンドラインで善良な市民になるということは、パイプを使用することを意味します。
垂直バーの使用|
コマンドの出力を別のコマンドの入力として渡し、複数のコマンドをチェーンして一意の出力を提供できます。
パイプを入力として使用する2つのチュートリアルを作成しました。gocowsayそしてgololcat、しかし、パイプから入力を取得するプロセスについては詳しく説明しなかったので、このトピックに関する記事を次に示します。
次に例を示します。
package main
import (
“bufio”
“fmt”
“io”
“os”
)
func main() {
info, err := os.Stdin.Stat()
if err != nil {
panic(err)
}
<span style="color:#66d9ef">if</span> <span style="color:#a6e22e">info</span>.<span style="color:#a6e22e">Mode</span>()<span style="color:#f92672">&</span><span style="color:#a6e22e">os</span>.<span style="color:#a6e22e">ModeCharDevice</span> <span style="color:#f92672">!=</span> <span style="color:#ae81ff">0</span> <span style="color:#f92672">||</span> <span style="color:#a6e22e">info</span>.<span style="color:#a6e22e">Size</span>() <span style="color:#f92672"><=</span> <span style="color:#ae81ff">0</span> {
<span style="color:#a6e22e">fmt</span>.<span style="color:#a6e22e">Println</span>(<span style="color:#e6db74">"The command is intended to work with pipes."</span>)
<span style="color:#a6e22e">fmt</span>.<span style="color:#a6e22e">Println</span>(<span style="color:#e6db74">"Usage: fortune | gocowsay"</span>)
<span style="color:#66d9ef">return</span>
}
<span style="color:#a6e22e">reader</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">bufio</span>.<span style="color:#a6e22e">NewReader</span>(<span style="color:#a6e22e">os</span>.<span style="color:#a6e22e">Stdin</span>)
<span style="color:#66d9ef">var</span> <span style="color:#a6e22e">output</span> []<span style="color:#66d9ef">rune</span>
<span style="color:#66d9ef">for</span> {
<span style="color:#a6e22e">input</span>, <span style="color:#a6e22e">_</span>, <span style="color:#a6e22e">err</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">reader</span>.<span style="color:#a6e22e">ReadRune</span>()
<span style="color:#66d9ef">if</span> <span style="color:#a6e22e">err</span> <span style="color:#f92672">!=</span> <span style="color:#66d9ef">nil</span> <span style="color:#f92672">&&</span> <span style="color:#a6e22e">err</span> <span style="color:#f92672">==</span> <span style="color:#a6e22e">io</span>.<span style="color:#a6e22e">EOF</span> {
<span style="color:#66d9ef">break</span>
}
<span style="color:#a6e22e">output</span> = append(<span style="color:#a6e22e">output</span>, <span style="color:#a6e22e">input</span>)
}
<span style="color:#66d9ef">for</span> <span style="color:#a6e22e">j</span> <span style="color:#f92672">:=</span> <span style="color:#ae81ff">0</span>; <span style="color:#a6e22e">j</span> < len(<span style="color:#a6e22e">output</span>); <span style="color:#a6e22e">j</span><span style="color:#f92672">++</span> {
<span style="color:#a6e22e">fmt</span>.<span style="color:#a6e22e">Printf</span>(<span style="color:#e6db74">"%c"</span>, <span style="color:#a6e22e">output</span>[<span style="color:#a6e22e">j</span>])
}
}
これがどのように機能するかを調べてみましょう。最初の興味深い行:
info, err := os.Stdin.Stat()
os.Stdin
、StdoutやStderrのように、オープンですファイル。これは、標準入力ファイル記述子を指します。
Stat()
を返すFileのメソッドですFileInfoファイルの説明、モードやファイルサイズなどの情報の提供。
次の興味深い作品は
info.Mode()&os.ModeCharDevice != 0
FileInfo.Mode()
を返しますuint32
ファイルモードとアクセス許可をconstとして決定するマスク(https://golang.org/pkg/os/#FileMode)。
ビット単位で署名し、ファイルモードがos.ModeCharDeviceであるかどうかを判別します。これは、ファイルがを指していることを確認する方法です。ModeCharDevice
、Unix文字デバイス(端末)。ファイルが指しているのでos.Stdin
、基本的に入力がパイプであることを除外しています。
モードが次の場合、ビット単位は0を返します。ない渡す定数。確認することもできます
info.Mode()&os.ModeCharDevice == os.ModeCharDevice
それは同じですが、より読みやすくなります。
これがfalseの場合、追加のチェックがあります
info.Size() <= 0
これは前のチェックと組み合わせて、入力パイプがあることを確認し、実際にはいくつかのバイトが含まれています。
確認することもできます
if info.Mode()&os.ModeNamedPipe != 0 {
// we have a pipe input
}
これにより、入力がパイプから確実に送られます。
次に、プログラムはリーダーを作成します
reader := bufio.NewReader(os.Stdin)
bufio
バッファリングされたI / Oを実装するパッケージで、基本的にラッピングio.Reader
そしてio.Writer
。
デフォルトのバッファサイズである4096バイトを使用して、os.Stdinからバッファリングされたリーダーを提供するように依頼します。
bufio.Reader
データを読み取るための多くの方法を提供します。ReadByte
、ReadBytes
、ReadLine
、ReadRune
、ReadSlice
、ReadString
。
使用例ReadRune
そのため、読み取った各ルーンをに追加できますvar output []rune
スライス、ハンドルユニコード何の努力もせずにchars。
続きを読む
その他のチュートリアル:
- NGINXリバースプロキシを使用してGoサービスを提供する
- Goで構造体のコピーを作成する
- GoWebサーバーの基本
- Goでのマップタイプの並べ替え
- 一言で言えばポインタを移動します
- タグの説明に行く
- 日付と時刻のフォーマットに移動
- Goを使用したJSON処理
- 可変個引数関数に移動
- GoStringsチートシート
- GoEmptyインターフェイスの説明
- Go withVSCodeとDelveのデバッグ
- NamedGoはパラメータを返します
- Goで乱数と文字列を生成する
- Goプロジェクトのファイルシステム構造
- Goに実装された二分探索アルゴリズム
- Goでのコマンドラインフラグの使用
- GOPATHの説明
- Goでコマンドラインアプリを作成する:lolcat
- Goを使用したCLIコマンドの作成:cowsay
- Goでのシェルパイプの使用
- CLIチュートリアルに移動:フォーチュンクローン
- Goを使用してフォルダ内のファイルを一覧表示します
- Goを使用して、GitHubからリポジトリのリストを取得します
- 移動し、文字列のスライスをファイルに追加します
- 文字列をバイトスライスに変換します
- GoでローカルGitの貢献を視覚化する
- GoCPUとメモリプロファイリングの開始
- Goプログラムの「インデックス作成をサポートしていません」エラーを解決する
- Goプログラムでの実行時間の測定
- 重複するタイトルを検出するためにGoを使用してWebクローラーを構築する
- ベストプラクティスに進む:ポインターまたは値のレシーバー?
- ベストプラクティスに進む:メソッドまたは関数を使用する必要がありますか?
- データ構造の移動:設定
- マップのチートシートに移動
- Goでジェネリック型の実装を生成する
- Goデータ構造:辞書
- Goデータ構造:ハッシュテーブル
- Go throughChannelsにイベントリスナーを実装する
- Goデータ構造:スタック
- データ構造の移動:キュー
- Goデータ構造:二分探索木
- Goデータ構造:グラフ
- Goデータ構造:リンクリスト
- Goデータ構造の完全ガイド
- Go値の比較
- Goはオブジェクト指向ですか?
- GoでのSQLデータベースの操作
- Goでの環境変数の使用
- チュートリアルに進む:PostgreSQLに裏打ちされたREST API
- GoWebサーバーでのCORSの有効化
- DockerコンテナへのGoアプリケーションのデプロイ
- GoがPHP開発者として学ぶための強力な言語である理由
- 移動し、io.Reader.ReadString改行文字を削除します
- 移動、変更を監視してプログラムを再構築する方法
- 行って、日付からの月を数えます
- GoでHTTPPOSTパラメーターにアクセスする