【问题标题】:Go: split byte.Buffer by newlineGo:用换行符分割 byte.Buffer
【发布时间】:2014-11-05 20:11:51
【问题描述】:

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

【问题讨论】:

    标签: go


    【解决方案1】:

    您可以通过bufio.Scanner 来做到这一点
    戈多克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

    【讨论】:

      【解决方案2】:

      考虑到strings.Split()返回一个数组,使用range会更方便

      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”查看更多信息。

      【讨论】:

      • 绝对推荐使用字符串阅读器 vs strings.Split。根据您的环境,拆分可能会在字符串末尾留下不需要的字符,例如 \r
      猜你喜欢
      • 2022-07-06
      • 2013-11-15
      • 1970-01-01
      • 2020-11-11
      • 2012-07-07
      • 2013-02-15
      • 2014-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多