Go:用换行符分割byte.Buffer

时间:2014-11-05 20:11:52

标签: go

Go的新手并遇到如下问题:

var metrics bytes.Buffer

metrics.WriteString("foo")
metrics.WriteString("\n")

metrics.WriteString("bar")
metrics.WriteString("\n")

现在,我希望循环显示指标并按换行符进行拆分。我试过了

for m := strings.Split(metrics.String(), "\n") {
     log.Printf("metric: %s", m)
}

但我得到以下

./relay.go:71: m := strings.Split(metrics.String(), "\n") used as value

2 个答案:

答案 0 :(得分:11)

您可以使用bufio.Scanner执行此操作 Godoc在http://golang.org/pkg/bufio/#Scanner

这样的事情:

var metrics bytes.Buffer

metrics.WriteString("foo")
metrics.WriteString("\n")

metrics.WriteString("bar")
metrics.WriteString("\n")

scanner := bufio.NewScanner(&metrics)
for scanner.Scan() {
    log.Printf("metric: %s", scanner.Text())
}

if err := scanner.Err(); err != nil {
    log.Fatal(err)
}

这里有一个完整的例子:http://play.golang.org/p/xrFEGF3h5P

答案 1 :(得分:4)

考虑到strings.Split()返回一个数组,使用范围

会更容易
m := strings.Split(metrics.String(), "\n")
for _, m := range strings.Split(metrics.String(), "\n") {
    log.Printf("metric: %s", m)
}

注意,要从字符串中读取行,您可以考虑“go readline -> string”:

bufio.ReadLine()或更好:bufio.Scanner

如:

const input = "Now is the winter of our discontent,\nMade glorious summer by this sun of York.\n"
scanner := bufio.NewScanner(strings.NewReader(input))

点击“Scanner terminating early”了解更多信息。