在 Golang 中写入文件

kop*_*aka 4 go

我对 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)
Run Code Online (Sandbox Code Playgroud)

我期望以下行为:

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

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

[123 34 ... <hug array of bytes>]
1384
[]
Run Code Online (Sandbox Code Playgroud)

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

ber*_*eal 5

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

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

更新:从评论来看,您似乎只需要序列化 ​​JSON 并将其作为 传递io.Reader,因为您实际上并不需要文件,这要归功于bytes.Buffer

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