我试图使用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.
答案 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))