首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试测试Go中goroutines的写文件

尝试测试Go中goroutines的写文件
EN

Stack Overflow用户
提问于 2014-10-03 00:58:41
回答 1查看 1.4K关注 0票数 0

嗯,我的部分代码是在没有方法方法的情况下工作的,我正在尝试将文本附加到文件中并从goroutines读取,但是我被困在这里试图编写它。

怎么啦?文件被创建了,但我不能附加文本,也许是一些明显的东西,但我似乎是盲目的,也许我不理解一些语言概念……

代码语言:javascript
复制
package main

import (
    "bufio"
    "fmt"
    "os"
    "sync"
    "time"
)

var w sync.WaitGroup

type Buffer struct {
    F *os.File
}

func (buff *Buffer) Open(pathName string) (err error) {
    buff.F, err = os.OpenFile(pathName, os.O_APPEND|os.O_CREATE, 0666)
    if err != nil {
        return
    }
    fmt.Println("Open() ok")
    return nil
}
func (buff *Buffer) Close() (err error) {
    err = buff.F.Close()
    if err != nil {
        return
    }
    fmt.Println("Close() ok")
    return nil
}
func (buff *Buffer) Push(data string) (err error) {
    w := bufio.NewWriter(buff.F)
    _, err = fmt.Fprintf(w, "data=%s", data)
    if err != nil {
        return
    }
    w.Flush()
    fmt.Println("Push() ok")
    return nil
}
func checkErr(err error) {
    if err != nil {
        fmt.Println(err.Error())
    }
}
func worker() {
    var err error
    buffer := new(Buffer)
    err = buffer.Open("test")
    checkErr(err)
    err = buffer.Push("data\n")
    checkErr(err)
    time.Sleep(5 * time.Second)
    err = buffer.Close()
    checkErr(err)
    w.Done()
}
func main() {
    w.Add(2)
    go worker()
    go worker()
    w.Wait()
}

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-03 01:15:27

像这样打开文件:

代码语言:javascript
复制
buff.F, err = os.OpenFile(pathName, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0666)

需要写入标志才能写入文件。

您错过了写入错误,因为忽略了来自布菲奥冲水的返回。更改推送到:

代码语言:javascript
复制
func (buff *Buffer) Push(data string) (err error) {
    w := bufio.NewWriter(buff.F)
    _, err = fmt.Fprintf(w, "data=%s", data)
    if err != nil {
        return
    }
    err = w.Flush()
    if err != nil {
        return err
    }
    fmt.Println("Push() ok")
    return nil
}

若要在不与其他推送交互的情况下干净地追加数据,则必须通过对文件写入方法的单个调用来写入数据。使用bytes.Buffer而不是bufio.Writer来确保对文件写入方法的单个调用:

代码语言:javascript
复制
func (buff *Buffer) Push(data string) (err error) {
    var b bytes.Buffer
    _, err = fmt.Fprintf(&b, "data=%s", data)
    if err != nil {
        return
    }
    _, err := buff.F.Write(b.Bytes())
    if err != nil {
        return err
    }
    fmt.Println("Push() ok")
    return nil
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26171854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档