go用于将不同类型的对象流存储到磁盘的设计模式?

时间:2015-05-04 23:02:44

标签: design-patterns go refactoring

考虑一个将不同类型的对象流保存到磁盘的函数:

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代码。

1 个答案:

答案 0 :(得分:3)

gob包似乎是解决问题的好方法。有一个伟大的article on the Go blog解释了如何以及为什么。摘录摘录:

  

gob包的设计考虑了许多目标。

     

首先,最明显的是,它必须非常容易使用。首先,因为   Go有反射,不需要单独的界面   定义语言或“协议编译器”。数据结构本身   是所有的包应该需要弄清楚如何编码和解码   它。另一方面,这种方法意味着gobs永远不会起作用   以及其他语言,但没关系:gobs是无耻的   去为中心。

     

效率也很重要。文本表示,例如   XML和JSON太慢,无法放在高效的中心   通讯网络。二进制编码是必要的。

     

Gob流必须是自我描述的。每个gob流,从中读取   开头,包含整个流可以提供的足够信息   由一个对其内容一无所知的代理解析。   此属性意味着您将始终能够解码一个gob   存储在文件中的流,即使在您忘记了它的数据之后很久   表示。

文章的下方是一个例子,展示了它的易用性和多样性。