1

キーボードから入力を読み取ったり、パイプで挿入されたファイルから一度に 1 行ずつ読み取ったりできる関数を作成しようとしています。prompt()このテスト コードのようなキーボード入力を受け取る関数が既にあります。

package main

import (
    "fmt"
    "bufio"
    "os"
)

func print(format string, a ...interface{}) {
    fmt.Printf(format+"\n", a...)
}

func prompt(format string) string {
    fmt.Print(format)
    in := bufio.NewScanner(os.Stdin)
    in.Scan()
    return in.Text()
}

func greet() {
    name := prompt("enter name: ")
    print(`Hello %s!`, name)
}

func humor() {
    color := prompt("enter favorite color: ")
    print(`I like %s too!`, color)
}

func main() {
    greet()
    humor()
}

ここではgreet()humor()両方を使用prompt()して入力を取得します。プログラムを実行して応答を入力すると、期待どおりに動作します。ただし、ファイルがある場合a.txt:

bobby bill
soft, blue-ish turquoise

そして run: .\test< a.txt、プログラムは次を出力します:

enter name: Hello bobby bill!
enter favorite color: I like  too!

それ以外の:

enter name: Hello bobby bill!
enter favorite color: I like soft, blue-ish turquoise too!

私が理解しているように、これは がread all でbufio.Scanner作成されたためです。グローバル変数を作成することでこの問題を簡単に解決でき、毎回新しい変数を作成する代わりにそれを使用できますが、グローバル変数に頼らずにこれを行うより良い方法があるかどうか疑問に思っています。greet()a.txtbufio.Scannerprompt()bufio.Scanner

4

2 に答える 2

1

あなたの分析は正しいです。問題は、bufio.Scanner1行以上のテキストをバッファリングするため、それを捨てるとその入力が失われることです。バッファリングされた入力を使用する場合は、この種の問題を回避するために、すべてが同じバッファを使用していることを確認する必要があります。

グローバル変数を使用することは、1 つの解決策です。もう 1 つは、型を作成して を保持し、bufio.Scanner一部の関数をメソッドに変換することです。

于 2013-10-24T08:03:37.900 に答える