0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

スクリプト言語の比較しながらGoのお勉強 〜 標準入力編

Last updated at Posted at 2020-02-10

前回からのおさらい

前回、Hello World編にて、標準出力に文字列を表示するという処理を確認しました。
今回はその対になります標準入力にてキーボードにて入力する文字列を受け取る処理を比較してみたいと思います。

標準入力

簡単にキーボードから1行入力された文字列を表示するプログラムを見ていくことにしましょう。

Goの標準入力

Goでの標準入力のプログラムです。

input.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パッケージはシステムのローレベルな処理から汎用的にレベルを上げたパッケージということですね。

bufioパッケージは、

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関数で入力処理を実装できます。
組み込み関数

input.py
text = input()
print(text)

実行結果

$ python input.py
Hello, Python
Hello, Python

Ruby

Rubyでは組み込み関数のgetsで実装可能です。
module Kernel

input.rb
text = gets
print text

実行結果

$ ruby input.rb
Hello, Ruby
Hello, Ruby

Perl

PerlではI/O演算子の<>で標準入力のファイルハンドルSTDINを指定して入力処理を実装します。
I/O 演算子

input.pl
$text = <STDIN>;
print $text;

実行結果

$ perl input.pl
Hello, Perl
Hello, Perl

Bash

Bashではreadコマンドで入力処理を実装します。
man read

input.sh
read text
echo $text

実行結果

$ bash input.sh
Hello, Bash
Hello, Bash

入力処理を比較してみて

入力処理を比較してみて感じたことはHello World編と同様で、本体は簡素に作られているというところです。
今回は多少パッケージのソースにも目を通してみたところ、低レベルの処理を駆使して実装はできるのでしょうが、
車輪の再発明は無駄で何も旨味がないためパッケージの使用を学ぶべきと感じました。
(但し、実装方法を確認することは多くの知見を得られますので、できる限りソースには目を通すべきだと思います)
では、次回以降は変数に関しての演算子や文字列処理について勉強したいと思います。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?