考虑一个将不同类型的对象流保存到磁盘的函数:
func Save(fill func(c chan BaseType), file string) {}
此功能在整个代码中以下列方式使用:
// Here we've got different data structures data1, data2, ...
// that must be stored to disk
Save(
func(c chan BaseType) {
// SaveChildren1 generates objects of type Child1 based
// on the data1 data structure
SaveChildren1(c, data1)
},
filename1)
Save(
func(c chan BaseType) {
// SaveChildren2 generates objects of type Child2 based
// on the data2 data structure
SaveChildren2(c, data2)
},
filename2)
等等。有许多不同的子类型,每个都需要它自己的生成器 - 函数SaveChildren1,SaveChildren2等。这些函数实际上用对象填充通道。
问题是如何重构这些“绑定器” - 将SaveChildren(2个args的函数)转换为1个参数的函数的函数?目前,此代码看起来不像是一个写得很好的go-style代码。
答案 0 :(得分:3)
gob包似乎是解决问题的好方法。有一个伟大的article on the Go blog解释了如何以及为什么。摘录摘录:
gob包的设计考虑了许多目标。
首先,最明显的是,它必须非常容易使用。首先,因为 Go有反射,不需要单独的界面 定义语言或“协议编译器”。数据结构本身 是所有的包应该需要弄清楚如何编码和解码 它。另一方面,这种方法意味着gobs永远不会起作用 以及其他语言,但没关系:gobs是无耻的 去为中心。
效率也很重要。文本表示,例如 XML和JSON太慢,无法放在高效的中心 通讯网络。二进制编码是必要的。
Gob流必须是自我描述的。每个gob流,从中读取 开头,包含整个流可以提供的足够信息 由一个对其内容一无所知的代理解析。 此属性意味着您将始终能够解码一个gob 存储在文件中的流,即使在您忘记了它的数据之后很久 表示。
文章的下方是一个例子,展示了它的易用性和多样性。