削除された内容 追加された内容
Ef3 (トーク | 投稿記録)
タグ: 2017年版ソースエディター
Ef3 (トーク | 投稿記録)
タグ: 2017年版ソースエディター
74 行
 
 
==== Java風の方法バッファリングされたI/O ====
bufioパッケージは、バッファリングされたI/Oの実装です。io.Reader または io.Writer オブジェクトをラップして<ref>Goでは慣習として、統一的にインターフェースを提供する関数の末尾は -er で終わります。</ref>、同じくインターフェイスを実装した別のオブジェクト (Reader または Writer) を作成しますが、バッファリングとテキスト I/O のためのいくつかの支援が提供されます。
 
;コード例
<syntaxhighlight lang="go">
 
package main
 
import (
"bufio"
"fmt"
"os"
)
 
func main() {
fmt.Println("文字列をなにか入力してください")
hensu := bufio.NewScanner(os.Stdin)
hensu.Scan()
 
fmt.Printf("あなたは %s と入力しました。",hensu.Text() )
 
hensu scanner := bufio.NewScanner(os.Stdin)
hensu if scanner.Scan() {
fmt.Printf("あなたは %s と入力しました。\n",hensu scanner.Text() )
}
if err := scanner.Err(); err != nil {
fmt.Fprintln(os.Stderr, "標準入力からの読み込み:", err)
}
}
</syntaxhighlight>
 
 
;実行例
105 行
あなたは ghf と入力しました。
</pre>
 
 
;解説
scanner 以外のbufio や NewScanner なども、すべて予約語ではなく、それぞれパッケージと関数である<ref>そもそもGoには、予約語(Resurved words)はなくキーワード(''Keywords''; 例えば '''type''')と事前宣言された識別子(''Predeclared identifiers''; 例えば '''int''')がある。</ref>。
ずいぶんと面倒であるが、これはおそらくJavaの文字入力の文法をマネていると思われる。
 
hensu 以外のbufio や NewScanner など、すべて予約語である。
 
Go言語は理念としては、本来なら Java の置き換えや連携などは狙っていないのだが(Java との連動をしている理念の言語は(Goではなく) Kotlin である)、なぜかGo言語は文法が所どころ、Javaに似ているのである。
 
 
上記コードは、なにをしているかと言うと、おおむね
:キーボード入力のできるオブジェクトを呼び出してメモリ領域などを確保し、 (※ hensubuffer := bufio.NewScanner(os.Stdin) あたり)
:そのオブジェクトをキーボード入力受け付けのモードに設定している、 (※ hensubuffer.Scan() あたり)
のような流れである。
 
 
ちなみにJava の場合、コンソール入力の方法は、
;Java の例:<source lang=java>
<pre>
Scanner hensuuscanner = new Scanner(System.in);
// これは Java 用です。Go用でもなくkotlin用でもないので注意!
String hensuuinputLine = hensuuscanner.nextLine();
 
</source>
Scanner hensuu = new Scanner(System.in);
のようにscanner 型を使ってオブジェクトを用意して、メモリ確保のために変数オブジェクトを宣言し(上記コードの Scanner hensuuscanner の部分 )、さらにその変数オブジェクトをレシーバーnextlinenextLine プロパティなどメソッド設定適用するという仕組みである。
String hensuu = hensuu.nextLine();
</pre>
のようにscanner 型を使ってオブジェクトを用意して、メモリ確保のために変数を宣言し(上記コードの Scanner hensuu の部分 )、さらにその変数に nextline プロパティなどを設定するという仕組みである。
 
== 参考文献 ==