在Go中迭代多行字符串

时间:2015-10-16 04:11:40

标签: go

在Python中,我可以遍历多行字符串。

x = """\
this is
my multiline
string!"""

for line in x.splitlines():
    print(line)

Can Go可以这样做吗?

3 个答案:

答案 0 :(得分:15)

您可以在Go中使用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()在多行字符串结尾处返回false。在每个循环中,我们打印扫描返回的行。

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

答案 1 :(得分:9)

如果要迭代问题中显示的多行字符串文字,请使用以下代码:

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
}

答案 2 :(得分:0)

我认为使用 bufio 是最好的选择,但如果您确实需要拆分一个 字符串,我认为 TrimRightTrimSuffix 好,因为它可以覆盖任何 重复尾随换行符或回车符的组合:

package main
import "strings"

func main() {
   x := `this is
my multiline
string!
`
   for _, line := range strings.Split(strings.TrimRight(x, "\n"), "\n") {
      println(line)
   }
}

https://golang.org/pkg/strings#TrimRight