7

io.ReadCloser オブジェクトから行を読み取る方法を見つけるか、「終了行」シンボルでバイト配列を分割する方法を見つける必要があります。しかし、終線記号が分からず、見つけられません。

私のアプリケーションはphpスクリプトを実行し、スクリプトからライブ出力を取得し、それを取得したときに「何か」を行う必要があります。

ここに私のコードの小さな部分があります:

cmd := exec.Command(prog, args)   
/* cmd := exec.Command("ls")*/
out, err := cmd.StdoutPipe()
if err != nil {
  fmt.Println(err)
}
err = cmd.Start()
if err != nil {
  fmt.Println(err)
}

この後out、go ルーチンでバッファを監視します。私は2つの方法を試しました。
1)nr, er := out.Read(buf)bufバイト配列です。ここでの問題は、新しい行ごとに配列をブレーキする必要があることです
。2) 2 番目のオプションは、新しい bufio.reader を作成すること です。 phpスクリプトはすぐにEnd Of Fileエラーを取得して終了します(phpからの出力が遅れているためだと思います)
r := bufio.NewReader(out)
line,_,e := r.ReadLine()

ls

StdoutPipe()編集:私の問題は、go ルーチン内で bufio.Reader を作成していたことですが、minikomi が提案した直後にそれを行うと、正常に動作します

4

2 に答える 2

9

bufio を使用してリーダーを作成し、次の改行文字まで読み取ることができます (文字を示す単一引用符に注意してください!)。

stdout, err := cmd.StdoutPipe()
rd := bufio.NewReader(stdout)
if err := cmd.Start(); err != nil {
    log.Fatal("Buffer Error:", err)
}

for {
    str, err := rd.ReadString('\n')
    if err != nil {
        log.Fatal("Read Error:", err)
        return
    }
    fmt.Println(str)
}

スクリプトを停止するものが何もないゴルーチンでリーダーから読み込もうとしている場合、スクリプトは終了します。

于 2012-10-25T10:55:48.550 に答える