拆分包括EOF?

时间:2016-11-27 15:59:40

标签: go split range

我试图使用go 1.7.3版本从Windows 7上的Donovan书中运行gopl.io/ch1/dup3程序。

当我运行下面的程序test.go时,我在结尾处得到一个空行。那是EOF吗?我如何将其与实际的空行区分开来?

package main
import (
  "fmt"
  "io/ioutil"
  "os"
  "strings"
)
func main() {
   Counts := make(map[string]int)
   for _, filename := range os.Args[1:] {
   data, err := ioutil.ReadFile(filename)
    if err != nil {
        fmt.Fprintf(os.Stderr, "%s: %v\n", os.Args[0], err)
        continue
    }
    for _, line := range strings.Split(string(data), "\r\n") {
        counts[line]++
    }
  }
  for line, n := range counts {
    if n > 1 {
        fmt.Printf("%d\t%s\n", n, line)
    }
  }
}

使用test.dat文件:

Line number one
Line number two

命令:

> test.exe test.dat test.dat

输出

2       Line number one  
2       Line number two  
2                           <-- Here is the empty line.

1 个答案:

答案 0 :(得分:1)

如果您的文件以换行符结尾,则在换行序列上拆分文件内容将导致无关的空字符串。如果在读取最终换行序列之前发生了EOF,那么就不会得到那个空字符串:

eofSlice := strings.Split("Hello\r\nWorld", "\r\n")
extraSlice := strings.Split("Hello\r\nWorld\r\n", "\r\n")

// [Hello World] 2
fmt.Println(eofSlice, len(eofSlice))

// [Hello World ] 3
fmt.Println(extraSlice, len(extraSlice))

Playground link