我对 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.
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)