golang——寫文件和讀文件


          之前聊過,操作文件——讀寫文件,直接調用接口即可. 如果是一直寫入操作,寫入操作一直進行的,免不了會有,有時一大批數據過來,有時沒有一條數據。

鑒於此場景,選擇用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()
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM