Golang:将[] int写入文件

时间:2014-04-01 14:44:57

标签: file go slice

我在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?,但它没有帮助。

2 个答案:

答案 0 :(得分:12)

如果交换格式(在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,这样可以更轻松地调试内容,并从其他语言中打开数据(以大小和效率为代价)

答案 1 :(得分:1)

你可以使用

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")
}