【问题标题】:Writing to a File in Golang在 Golang 中写入文件
【发布时间】:2020-05-27 10:09:17
【问题描述】:

我对 Golang 还很陌生,还不确定如何使用某些语言结构。目前我有以下代码(带有测试调试输出),它没有提供预期的结果:

    json, _ := json.Marshal(struct)
    fmt.Println(json)

    f,_ := os.Create(fmt.Sprintf("/tmp/%s.json", "asd"))

    i,_ := f.Write(json)
    fmt.Println(i)  

    b, err := ioutil.ReadAll(f)
    fmt.Print(b)

我期望以下行为:

  • 将结构转换为字节数组
  • 创建新文件
  • 将字节数组附加到文件中

但是,当我在我的环境 (AWS Lambda) 中运行代码以及在 Golang Playground 中使用它时,该文件始终为空。 上述代码的输出如下所示:

[123 34 ... <hug array of bytes>]
1384
[]

这让我相信我没有正确使用f.Write(),尽管我遵循了包文档。所有其他输出都表明预期的行为,那么我的错误是什么?我在某种程度上受限于使用File 接口,否则我会选择ioutil.WriteFile()。我的假设是在某些时候对指针/值有误解,但编译器阻止了 &amp;f 的使用。

【问题讨论】:

    标签: go


    【解决方案1】:

    f.Write() 之后,您在文件中的当前位置位于文件末尾,因此ioutil.ReadAll() 将从该位置读取并且不返回任何内容。

    您需要先调用f.Sync() 确保数据持久保存到磁盘,然后再调用f.Seek(0, 0) 以先回退到文件的开头。

    更新:来自 cmets,您似乎只需要序列化 ​​JSON 并将其作为io.Reader 转发,因为您并不需要文件,感谢bytes.Buffer

    data, _ := json.Marshal(s)
    buf := bytes.NewBuffer(data)
    b, _ := ioutil.ReadAll(buf)
    fmt.Print(string(b))
    

    【讨论】:

    • 可能有助于解释同步和搜索的作用。
    • 哦,哇,我没想到这些操作是必要的。非常感谢,它现在可以在两种环境中使用!因此,如果我实际上没有将文件保存在磁盘上,而只是将 File 对象传递给另一个函数,我可能可以省略 Sync() 并只是“倒回”位置计数器。
    • @kopaka 我实际上不太确定没有Sync() 的情况下它的表现如何,以及这是否是特定于平台的,需要查看fsync / fseek 文档。
    • @bereal 并且对于任何想知道的人:它确实有效,因为我将 File 对象传递给另一个函数,该函数将其存储到 S3 存储桶中,因此无需实际物理存储文件。
    • @kopaka 在这种情况下你真的不需要文件,检查bytes.Buffer
    猜你喜欢
    • 2014-05-12
    • 1970-01-01
    • 2022-10-20
    • 1970-01-01
    • 2018-01-01
    • 1970-01-01
    • 2017-09-27
    • 2017-07-30
    • 1970-01-01
    相关资源
    最近更新 更多