之前聊過,操作文件——讀寫文件,直接調用接口即可. 如果是一直寫入操作,寫入操作一直進行的,免不了會有,有時一大批數據過來,有時沒有一條數據。
鑒於此場景,選擇用select....channel 的模型處理。 代碼如下:
package main import ( "fmt" "time" "os" "strconv" "strings" ) func main() { fd , _ := os.OpenFile("a.txt",os.O_RDWR|os.O_CREATE|os.O_APPEND,0644) var a chan string a =make(chan string) go sendDataTo(a) getAchan(10*time.Second,a, fd) fd.Close() } func sendDataTo(a chan string) { // for { // a <- "我是a通道的數據" // time.Sleep(1e9 *3) // } for i:=0; i<10; i++{ time.Sleep(1e9 *2) a <- strconv.Itoa(i) } } //在一定時間內接收不到a的數據則超時 func getAchan(timeout time.Duration, a chan string, fd *os.File) { var after <-chan time.Time loop: var BuffItems []string after = time.After(timeout) for{ fmt.Println("等待a中的數據,10秒后沒有數據則再重新接收") select { case x :=<- a: BuffItems = append(BuffItems,x)
if len(BuffItems) <5 {continue }else{ dd := strings.Join(BuffItems, ",") fmt.Println("....@@@@......",dd) content := "寫入的文件內容" + dd fd.WriteString(content) fd.WriteString("\n") } goto loop case <-after: fmt.Println("timeout.") dd := strings.Join(BuffItems, ",") fmt.Println("....@@@@...timeout1111...",dd) if len(dd) <1{ goto loop }else{ content := "寫入的文件內容timeout" + dd fd.WriteString(content) fd.WriteString("\n") } goto loop // return } } }
可根據 超時時間和接收數據的數量,兩個維度處理。沒有數據在channel接收到的時候,則等待。
下面這種是傳統的對文件操作的方式,並統計寫文件的時間。
package main import ( "fmt" "time" "reflect" "os" "strconv" "strings" ) //耗時統計函數 func timeCost() func() { start := time.Now() return func() { tc := time.Since(start) fmt.Printf("time cost = %v\n", tc) } } func sum(n int, fd *os.File) { defer timeCost()() //注意,是對 timeCost()返回的函數進行調用,因此需要加兩對小括號 for i:=1; i <= n; i++ { stri := strconv.Itoa(i) content := "寫入的文件內容" + stri fd.WriteString(content) fd.WriteString("\n") } } func main() { fd , _ := os.OpenFile("a1.txt",os.O_RDWR|os.O_CREATE|os.O_APPEND,0644) sum(10000,fd) time.Sleep(1000* time.Second) fd.Close() }