2015-10-16 137 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