第 4 个版本的代码 goto_v4 见 goto_v4。
如果你是个敏锐的测试者也许已经注意到了,当 goto 程序启动 2 次,第 2 次启动后能读取短 URL 且完美地工作。然而从第 3 次开始,会得到错误:
Error loading URLStore: extra data in buffer
这是由于 gob 是基于流的协议,它不支持重新开始。为补救该问题,这里我们使用 json 作为存储协议(见 12.9 节),它以纯文本形式存储数据,因此也可以被非 Go 语言编写的进程读取。同时也显示了更换一种不同的持久化协议是多么简单,因为与存储打交道的代码被清晰地隔离在 2 个方法中,即 load()
和 saveLoop()
。
从创建新的空文件 store.json 开始,更改 main.go 中声明文件名变量的那一行:
var dataFile = flag.String("file", "store.json", "data store file name")
在 store.go 中导入 json
取代 gob
。然后在 saveLoop()
中唯一需要被修改的行:
e := gob.NewEncoder(f)
更改为:
e := json.NewEncoder(f)
类似的,在 load
方法中:
d := gob.NewDecoder(f)
修改为:
d := json.NewDecoder(f)
这就是所有要改动的地方!编译,启动并测试,你会发现之前的错误不会再发生了。