這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
package mainimport ("os""fmt""bufio""strings""strconv")func main() {f, _:=os.OpenFile("a.txt", os.O_RDONLY, 0666)defer f.Close()m:=bufio.NewReader(f)char:=0words:=0lines:=0for{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切片?(恩恩,這點沒搞清楚,應該是切片,看來還得回去學習。。)