2015-10-16 89 views

回答

5

您可以隨時隨地使用bufio.Scanner其在從io.Reader線迭代。以下示例從給定的多行字符串中創建一個閱讀器,並將其傳遞給掃描儀工廠功能。每次調用scanner.Scan()都會在下一行分隔讀取器並緩存行。如果沒有更多行,則返回false。撥打scanner.Text()將返回緩衝分組。

var x string = `this is 
my multiline 
string` 

scanner := bufio.NewScanner(strings.NewReader(x)) 
for scanner.Scan() { 
    fmt.Println(scanner.Text()) 
} 

在這個例子中,for循環將持續到Scan()回報在多字符串的結尾假的。在每個循環中,我們打印掃描返回的行。

https://play.golang.org/p/U9_B4TsH6M

+2

你應該檢查錯誤。請參閱'bufio'示例:https://golang.org/pkg/bufio/#example_Scanner_lines。 – peterSO

4

如果你想如圖所示的問題遍歷一個多字符串中,然後使用此代碼:

for _, line := range strings.Split(strings.TrimSuffix(x, "\n"), "\n") { 
    fmt.Println(line) 
} 

Run the code on the playground

如果你想遍歷從文件中讀取數據,使用bufio.Scanner。該文檔具有顯示如何通過迭代行的例子:

scanner := bufio.NewScanner(f) // f is the *os.File 
for scanner.Scan() { 
    fmt.Println(scanner.Text()) // Println will add back the final '\n' 
} 
if err := scanner.Err(); err != nil { 
    // handle error 
} 
+0

雖然這是比其他解決方案更簡單,應該注意的是,如果換行恰好是'這不會剝離''\ r''字符‘\ r \ n’個'(可能是如果該字符串是從Windows上編輯的文件中讀取的)。 'Scanner'正確處理所有有效的換行符。 – icza

+0

@icza沒有必要去掉'\ r'。 [返回字符('\ r')從原始字符串值中刪除](https://golang.org/ref/spec#String_literals)。 –

+0

我不是在談論原始字符串文字,我正在討論在Windows上編輯的文件(其中行結束符是「\ r \ n」'),如果這個文件被讀取,例如用'ioutil.ReadFile()',它也會包含''r''字符。另外''\ r''字符不會從非原始字符串文字中刪除。 – icza