一個標準輸出流,我想寫的,我用bufio.NewScanner
和Scan()
效用函數的測試。我通常在stdout
上使用它,現在我想模擬一小段流,以便爲測試目的返回一些靜態字符串。模擬爲bufio.NewScanner
bufio.NewScanner(r io.Reader)
需要Reader
但只需要一個read
方法。通過閱讀源代碼,我無法弄清楚從緩存讀取或如何在被傳遞。
我怎麼能嘲笑,在一個簡短的方式嗎?
一個標準輸出流,我想寫的,我用bufio.NewScanner
和Scan()
效用函數的測試。我通常在stdout
上使用它,現在我想模擬一小段流,以便爲測試目的返回一些靜態字符串。模擬爲bufio.NewScanner
bufio.NewScanner(r io.Reader)
需要Reader
但只需要一個read
方法。通過閱讀源代碼,我無法弄清楚從緩存讀取或如何在被傳遞。
我怎麼能嘲笑,在一個簡短的方式嗎?
要簡單地測試你的代碼,你可以使用@斯文的答案。
要得到一個簡單的io.Reader
用於測試的想法,考慮下面的例子:
type R struct {
Data string
done bool
}
func (r *R) Read(p []byte) (n int, err error) {
copy(p, []byte(r.Data))
if r.done {
return 0, io.EOF
}
r.done = true
return len([]byte(r.Data)), nil
}
R
是可以被具有Read
方法實現的io.Reader
接口的自定義測試類型。因此,它將被NewScanner
接受。它可以用作:
func NewR(data string) *R {
return &R{data, false}
}
r := NewR("Test\nmessage\n")
scanner := bufio.NewScanner(r)
for scanner.Scan() {
fmt.Printf("Line: %s\n", scanner.Text())
}
輸出:
Line: Test
Line: message
兩種類型R
及其Read
方法已被定義爲字節的一個簡單的源工作。 Scan
調用它的讀者(輸入NewScanner
)Read
方法,直到它得到一個EOF
或錯誤。爲簡單起見,R
的Read
方法複製其數據到在其第一呼叫呼叫者的緩衝液(p
),並返回的任何後續呼叫的EOF
。
請注意,在\n
處的行的實際分割由scanner.Scan
而不是r.Read
完成。
您可以修改上面的Read
方法來獲得定製的行爲按您的要求。
感謝您的詳細解釋,這使得現在有很多意義! – Mahoni
您可以使用bytes.Buffer
,因爲它實現了io.Reader
功能。
例https://play.golang.org/p/gjjMmT3SzD:
package main
import (
"bufio"
"bytes"
"fmt"
)
func main() {
buf := bytes.NewBufferString("foo\nbar")
scanner := bufio.NewScanner(buf)
for scanner.Scan() {
fmt.Println(scanner.Text())
}
}
你說的對'stdout'使用'bufio.NewScanner'是什麼意思?你在用'stdout'創建一個新的掃描器嗎? – abhink
@abhink是'bufio.NewScanner(os.Stdout)' – Mahoni