4
节的keyValue.go
应用吗?复合类型的使用,它还远远没有完成,所以在本节中,你将学习如何将键值存储的数据保存在磁盘上,以及如何在下一次启动应用程序时将其加载到内存。save()
保存数据到磁盘,load()
从磁盘加载数据。因此,我们将用diff(1)
Unix
命令行程序显示keyValue.go
和kvSaveLoad.go
之间的代码差异。当你希望发现两个文本文件之间的差异时,diff(1)
Unix
命令行实用程序非常方便。通过在Unix
shell
命令行上执行man 1 diff
,你可以了解更多关于它的信息。
Go
映射的内容保存到磁盘,以及一种方法来加载文件中的数据并将其放入Go
映射。encoding/gob
标准Go
包将用于kvSaveLoad.go
程序。它将有助于序列化和反序列化过程。encoding/gob
包使用gob
格式存储其数据。这种格式的官方名称是流编码。gob
格式的好处是,Go
完成了所有的繁琐工作,因此你不必担心编码和解码阶段。Go
包可以帮助你序列化和反序列化数据,encoding/xml
使用XML
格式,encoding/json
使用JSON
格式。kvSaveLoad.go
和keyValue.go
之间的代码更改,不包括save()
和load()
函数的实现,这些函数将在这里完整地展示:diff(1)
输出的一个重要部分是DATAFILE
全局变量的定义,该变量保存键值存储使用的文件路径。除此之外,还可以看到load()
函数的调用位置以及save()
函数的调用位置。load()
函数首先在main()
函数中使用,而save()
函数在用户发出STOP
命令时执行。save()
函数实现如下:save()
函数做的第一件事是使用os.Remove()
函数删除现有数据文件,以便稍后创建它。save()
函数所做的最关键的任务之一是确保你可以实际创建并写入所需的文件。尽管有很多方法可以做到这一点,但是save()
函数是最简单的方法,即检查os.Create()
函数返回的错误值。如果该值不是nil
,那么就会出现问题,save()
函数在不保存任何数据的情况下结束。load()
函数实现如下:load()
函数的任务之一是确保要读取的文件确实存在,并且可以毫无问题地读取它。load()
函数再次使用最简单的方法,即查看os.Open()
函数的返回值。如果返回的错误值等于nil
,则一切正常。save()
函数将覆盖该文件。文件的释放由defer loadFrom.Close()
语句完成。kvSaveLoad.go
会产生如下的输出:goroutines
服务于多个网络客户端。