無限です。ゴーBUFIO ReadStringは、私は次のコードを持っている
同じ時間に、このコードは正常に動作している間:最初のソリューションは、このような行動を持っている理由
v, e := r.ReadString('\n')
for e == nil {
fmt.Println(v)
v, e = r.ReadString('\n')
}
誰かが説明できますか?ループの
無限です。ゴーBUFIO ReadStringは、私は次のコードを持っている
同じ時間に、このコードは正常に動作している間:最初のソリューションは、このような行動を持っている理由
v, e := r.ReadString('\n')
for e == nil {
fmt.Println(v)
v, e = r.ReadString('\n')
}
誰かが説明できますか?ループの
構造は次のとおりです。
for init; condition; post { }
ループのinit
部分は冒頭で、一度だけ呼ばれます。それは... ...あなたのループからの部分は、あなたのループの実装がr
からの最初の行のみを読み取り、なぜe
は無限で、その結果、常にnil
である理由を説明している、一度だけ
v, e := r.ReadString('\n')
と呼ばれていることを意味しループ。
あなたが代わりにこのような何かやりたいことがあり:
for v, e := "", (error)(nil); e == nil; {
v, e = r.ReadString('\n')
fmt.Println(v)
}
それともそれはあなたに奇妙に見えるならば、このような何か:ここ
var v string
var e error
for ; e == nil; {
v, e = r.ReadString('\n')
fmt.Println(v)
}
さらに詳しい情報:
をimport "bufio"
func (b *Reader) ReadString(delim byte) (string, error)
ReadStringは、入力におけるDELIMの最初の発生まで、 はまでを含むデータを含む文字列を返す読み出し デリミタ。 ReadStringが 区切り文字を見つける前にエラーを検出すると、エラーの前に読み取られたデータとエラー 自体(しばしばio.EOF)が返されます。 ReadStringは、返されたデータがデリミートで終わらない場合にのみ、 の場合にerr!= nilを返します。簡単に使用するには、スキャナ が便利です。
これはXY problemです:XYの問題ではなく、あなたの実際の問題よりも、あなたの未遂ソリューションについて尋ねています。
bufio.ReadString
のドキュメントにある「簡単な使い方のために、スキャナが便利かもしれません」というアドバイスを受けなかったのはなぜですか?
for
ループを使用する方法がわかっていても、bufio.ReadString
を正しく使用することは複雑です。機能reader
を参照してください。
bufio.Scannner
を正しく使用すると、for
ループを使用する方法がわからなくても簡単です。機能scanner
を参照してください。例えば
、
package main
import (
"bufio"
"fmt"
"io"
"net/http"
"os"
"strings"
)
func reader(url string) error {
resp, err := http.Get(url)
if err != nil {
return err
}
defer resp.Body.Close()
// ReadString
r := bufio.NewReader(resp.Body)
for {
line, err := r.ReadString('\n')
if len(line) == 0 && err != nil {
if err == io.EOF {
break
}
return err
}
line = strings.TrimSuffix(line, "\n")
fmt.Println(line)
if err != nil {
if err == io.EOF {
break
}
return err
}
}
return nil
}
func scanner(url string) error {
resp, err := http.Get(url)
if err != nil {
return err
}
defer resp.Body.Close()
// Scanner
s := bufio.NewScanner(resp.Body)
for s.Scan() {
line := s.Text()
fmt.Println(line)
}
if s.Err() != nil {
return err
}
return nil
}
func main() {
url := "https://www.example.com"
fmt.Println("\nReader:\n")
err := reader(url)
if err != nil {
fmt.Fprintln(os.Stderr, err)
}
fmt.Println("\nScanner:\n")
err = scanner(url)
if err != nil {
fmt.Fprintln(os.Stderr, err)
}
fmt.Println("\n")
}