如果你是一个敏锐的测试人员,也许你已经注意到,当 goto 第 2 次启动的时候,它有短 urls 并且可以完美运行,然而从第 3 次开始,我们会收到这个错误: Error loading URLStore: extra data in buffer. This is because gob is a stream based protocol that doesn’t support restarting 。这里我们将通过使用 json 作为存储协议,来弥补这种情况( 参见 章节 12.9 ),它将数据存储成纯文本,因此他也可以被 Go 以外的其他语言编写的进程读取。这也展示了转换不同的持久协议是多么的容易,因为处理存储的代码在两种方法中彻底分离,即 load 和 saveLoop 。
首先创建一个新的空文件 store.json
,并且改变 main.go 中变量文件声明的那一行:
var dataFile = flag.String("file", "store.json", "data store file name")
在 store.go 中将导入 gob 替换成 导入 json 。然后在 saveLoop 只需要修改这行:
e := gob.NewEncoder(f)
我们将它改成: e := json.NewEncoder(f)
同样的,在 load 方法中修改这行: d := gob.NewDecoder(f)
将它改成: d := json.NewDecoder(f)
这是我们要改变的所有内容! 编译、启动并测试: 你将看到,之前的错误不会再出现。
版本 5 —— 分布式程序:
第 5 版的 goto_5 代码(将在 章节 19.8 和 章节 19.9 中讨论)能够在 code_examples\chapter_19\goto_v5 中找到。这个版本中继续使用 gob 存储,但是它可以很容易的去适配 josn ,就像在版本 4 中的演示。