我在p []int
中有一些数据,我想将其保存/加载到/从文件加载。我应该将此切片转换为[]byte
并使用(如果是,如何?
func (f *File) Read(b []byte) (n int, err Error)
func (f *File) Write(b []byte) (n int, err error)
或者还有其他方法可以将[]int
保存到文件?
我读了这个如何使用golang读取/写入文件?,它没有帮助。
如果交换格式(在 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,这使您可以更轻松地调试内容,并打开其他语言的数据(以大小和效率为代价)。
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")
}