2017-11-24 4 views

答えて

0

構造は次のとおりです。

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) 
} 

さらに詳しい情報:

2

Package bufio

import "bufio" 

func (*Reader) ReadString

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") 
} 

遊び場:https://play.golang.org/p/e0WY_aNxW8

関連する問題