zoukankan      html  css  js  c++  java
  • 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(" ") } 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(" ") } 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
    ", 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("
    ")
      }
    }
    
    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()
    }
  • 相关阅读:
    一篇文章搞懂密码学基础及SSL/TLS协议
    如何编写一个多进程性能测试程序
    自动化测试用例编写日志总结(一)
    Python lambda匿名函数
    Python map() 函数
    python中sorted函数的理解(对list列表排序,对dict字典排序)
    python list列表冒泡排序
    range的用法
    同时安装python2和python3是使用pip的方法:
    cmd输出文件树结构
  • 原文地址:https://www.cnblogs.com/unqiang/p/12054123.html
Copyright © 2011-2022 走看看