我在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?,但它没有帮助。
答案 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")
}