【问题标题】:Golang: write []int to fileGolang:将 []int 写入文件
【发布时间】:2014-05-12 10:16:57
【问题描述】:

我在p []int 中有一些数据,我想将其保存/加载到/从文件中。我应该将此切片转换为[]byte 并使用(如果是,如何?)

func (f *File) Read(b []byte) (n int, err Error)
func (f *File) Write(b []byte) (n int, err error)

或者还有其他方法可以将[]int 保存到文件中吗?

我读了这个How to read/write from/to file using golang?,但没有帮助。

【问题讨论】:

  • 您希望如何存储数据?如果它是二进制的,它应该是大端还是小端? int类型在不同平台上大小不同,那么应该存储多少精度呢?
  • 数据如何存储并不重要,我想保存它,重新启动应用程序,然后在 RAM 中获取相同的数据。我想存储[]int32
  • @Sam,不,你不能说它不重要:一方面,内存中的数据是一个抽象概念(在 Go 中,你使用 ints 可能有不同从一个硬件平台到另一个硬件平台的表示),另一方面,存储介质上的数据必须具有一定的格式。由你来决定到底是哪一个。这可能是 JSON 文件、XML 文件、数据库、自定义格式的纯二进制文件、自定义格式的纯文本文件——可能性无穷无尽。

标签: file go slice


【解决方案1】:

如果交换格式(在 go 以外的语言之间)或将其作为流读取对您来说并不重要,只需使用 gob 编码器和解码器。

http://golang.org/pkg/encoding/gob/

这个想法是,您围绕编写器创建编码器,或围绕读取器创建解码器,然后只要求他们对结构进行编码或解码。编码是这样的:

p := []int{1,2,3,4}

encoder := gob.NewEncoder(myFileWriter)
err = encoder.Encode(p)
if err != nil {
    panic(err)
}

解码的工作方式正好相反:

decoder := gob.NewDecoder(myFileReader)
p := []int{}

err = decoder.Decode(&p)
if err != nil {
         panic(err)
}

或者,您可以使用标准库中提供的类似方法,将数据存储为 JSON 或 XML,这使您可以更轻松地调试事物,并从其他语言打开数据(以大小和效率为代价) .

【讨论】:

  • 如果语言之间的格式交换是进口的? :) 解决这个问题的方法是什么。
  • @Roylee json 将是最简单的解决方案。但是有很多。
【解决方案2】:

你可以使用

file.WriteString(fmt.Sprintln(p))

一个完整的例子:

    /*path of the file test.txt : you have to change it*/
var path = "/Users/Pippo/workspace/Go/src/......./test.txt"

func main() {

    p := []int{1, 2, 3, 4, 5, 8, 99}
    fmt.Println(p)
    createFile()
    writeFile(p)

}

/*create file*/
func createFile() {

    // detect if file exists
    var _, err = os.Stat(path)

    // create file if not exists
    if os.IsNotExist(err) {
        var file, err = os.Create(path)
        if isError(err) {
            return
        }
        defer file.Close()
    }

    fmt.Println("==> done creating file", path)
}



/* print errors*/
func isError(err error) bool {
    if err != nil {
        fmt.Println(err.Error())
    }

    return (err != nil)
}

/*writeFile write the data into file*/
func writeFile(p []int) {

    // open file using READ & WRITE permission
    var file, err = os.OpenFile(path, os.O_RDWR, 0644)

    if isError(err) {
        return
    }
    defer file.Close()

    // write into file
    _, err = file.WriteString(fmt.Sprintln(p))
    if isError(err) {
        return
    }

    // save changes
    err = file.Sync()
    if isError(err) {
        return
    }

    fmt.Println("==> done writing to file")
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-25
    • 2018-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-22
    • 2013-11-04
    • 1970-01-01
    相关资源
    最近更新 更多