前回からのおさらい
前回、Hello World編にて、標準出力に文字列を表示するという処理を確認しました。
今回はその対になります標準入力にてキーボードにて入力する文字列を受け取る処理を比較してみたいと思います。
標準入力
簡単にキーボードから1行入力された文字列を表示するプログラムを見ていくことにしましょう。
Goの標準入力
Goでの標準入力のプログラムです。
package main
import (
"fmt"
"os"
"bufio"
)
func main() {
stdin := bufio.NewScanner(os.Stdin)
stdin.Scan()
text := stdin.Text()
fmt.Printf(text + "\n")
}
実行してみましょう。
$ go run input.go
Hello, Go
Hello, Go
ただ単に鸚鵡返しするだけですが、思い通りの処理はできています。
プログラムの中身ですが、
importで3つのパッケージを読み込んでいます。fmt
パッケージは標準出力でも使用したものですね。os
パッケージとbufio
パッケージは今回初めて使用するライブラリです。
os
パッケージは公式サイトによると、
オペレーティングシステムの機能へのプラットフォームに依存しないインタフェースを提供します。
Unixライクな設計です。
ドキュメントを読んでるとsyscall
パッケージをラップしていることがわかりました。os
パッケージはシステムのローレベルな処理から汎用的にレベルを上げたパッケージということですね。
I/Oのバッファリング機能を提供します。io.Reader・io.Writerをラップし、別のオブジェクト(ReaderまたはWriter)を作成します。インタフェースは同じままでバッファリングやその他便利な機能を追加します。
とのことでio
パッケージをラップして機能拡張しているものの様です。
処理に関してですが、10行目のNewScannerはドキュメントによると1行ごと読み込む処理です。
またos.Stdinの処理はsyscall.Stdin
で/dev/stdin
を開いたファイルディスクリプたということで、標準入力を1行ごと読み込む処理の様です。
11行目で1行ごとバッファし、12行目で変数に文字列を格納、そして15行目で出力という流れになっています。
簡単な標準入力の処理ですが、なかなか理解しなければならないことの多いGoです。
では、他の言語との比較です。
Python
Pythonでは組み込み関数のinput
関数で入力処理を実装できます。
組み込み関数
text = input()
print(text)
実行結果
$ python input.py
Hello, Python
Hello, Python
Ruby
Rubyでは組み込み関数のgets
で実装可能です。
module Kernel
text = gets
print text
実行結果
$ ruby input.rb
Hello, Ruby
Hello, Ruby
Perl
PerlではI/O演算子の<>
で標準入力のファイルハンドルSTDIN
を指定して入力処理を実装します。
I/O 演算子
$text = <STDIN>;
print $text;
実行結果
$ perl input.pl
Hello, Perl
Hello, Perl
Bash
Bashではread
コマンドで入力処理を実装します。
man read
read text
echo $text
実行結果
$ bash input.sh
Hello, Bash
Hello, Bash
入力処理を比較してみて
入力処理を比較してみて感じたことはHello World編と同様で、本体は簡素に作られているというところです。
今回は多少パッケージのソースにも目を通してみたところ、低レベルの処理を駆使して実装はできるのでしょうが、
車輪の再発明は無駄で何も旨味がないためパッケージの使用を学ぶべきと感じました。
(但し、実装方法を確認することは多くの知見を得られますので、できる限りソースには目を通すべきだと思います)
では、次回以降は変数に関しての演算子や文字列処理について勉強したいと思います。