package main import ( "os" "fmt" "bufio" "strings" "strconv" ) func main() { f, _:=os.OpenFile("a.txt", os.O_RDONLY, 0666) defer f.Close() m:=bufio.NewReader(f) char:=0 words:=0 lines:=0 for{ s, ok:=m.ReadString('\n') fmt.Println(s) char+=len(s) words+=len(strings.Fields(s)) lines++ if ok!=nil{ break } } fmt.Println("char:"+toString(char)+",words:"+toString(words)+",lines:"+toString(lines)) } func toString(a interface{}) string{ if v,p:=a.(int);p{ return strconv.Itoa(v) } if v,p:=a.(float64); p{ return strconv.FormatFloat(v,'f', -1, 64) } if v,p:=a.(float32); p { return strconv.FormatFloat(float64(v),'f', -1, 32) } if v,p:=a.(int16); p { return strconv.Itoa(int(v)) } if v,p:=a.(uint); p { return strconv.Itoa(int(v)) } if v,p:=a.(int32); p { return strconv.Itoa(int(v)) } return "wrong" }
程序的主要目的是读取某文件,输出到屏幕,并输出其中字数,单词数,行数,这是一个来自《学习go语言》的练习题。
f, _:=os.OpenFile("a.txt", os.O_RDONLY, 0666)这一句是建立一个到a.txt的只读的文件流(其实我问高手说叫文件资源句柄。我觉得好像流更好理解,就姑且让我用流来描述)。
defer f.Close() 用到的是go语言中的压后语句defer,确保在此函数结束后关闭流f。
m:=bufio.NewReader(f)在f流外面包一层用来读的缓冲管道,形成新的缓冲流m。
s, ok:=m.ReadString('\n') m读取文件,读到'\n'时停下来,返回之前读到的string
strings.Fields(s) 把s根据空白字符进行分割,得到一个字符串数组还是slice切片?(恩恩,这点没搞清楚,应该是切片,看来还得回去学习。。)
有疑问加站长微信联系(非本文作者)