搜狐首页 科技 守护丽人

手机搜狐

SOHU.COM

Go 的高级编码和解码技术

OSC协作翻译

原文:AdvancedEncodingandDecodingTechniquesinGo

链接:https://blog.gopheracademy.com/advent-2016/advanced-encoding-decoding/

译者:Viyi,无若,snake_007,leoxu, 边城, heiing, 奔跑的蛮牛

高级编码和解码技术

Go 的标准库包含了一些很不错的编码和解码包,里面涵盖了大量的编码方案。一切数据,不管是CSV,XML,JSON,还是 gob —— 一个 Go 特定的编码格式,都涵盖在内,并且,这些包都非常容易上手使用。 事实上,它们中的大多数都不需要再添加任何代码,你只需插入数据,它就会输出编码后的数据。

不过,并不是所有的应用程序都乐于处理这种到 JSON 展现的一对一映射。Struct 标记可以涵盖一些场景中的大多数情况,但如果你使用了很多 API,它的功能还是有限。

例如,你可能会遇到一个 API,它会输出不同的对象到同一个键,使其成为泛型的首选后补对象,但是 Go 并没有这些东西。或者你也可能会使用一个 API,它可以接收并且返回 Unix 时间 而不是 RFC 3339 格式的时间,虽然我们可以在代码中将它表达成一个 int,但是如果可以直接以 time 包的 Time 类型来操作,岂非更好?

在这篇文章中,我们将回顾一些技术,它们可以帮助我们将繁琐的代码简化成相对容易处理的代码。我们会使用 encoding/json 包来做这件事情,而值得注意的是 Go 为大多数编码类型提供了一个 Marshaler 和 Unmarshaler 接口,让你可以在多编码场景中对数据被编码和解码的方式进行自定义。

长期有效的新类型方法

我们要检查的第一种技术是创建一个新类型,并在编码和解码之前将数据和这个类型进行转换。从技术层面说,这不是一个具体的编码方案,但它非常可靠并易于遵循。它属于一项基本技术,后面几节我们也会用到,所以值得你现在花时间看一看。

想像一下,我们的应用是从下面简单的 Dog 类型开始。

默认情况下,time.Time 类型按 RFC 3339 格式提供。也就是说,它会是一个字符串,类似于 2016-12-07T17:47:35.099008045-05:00。

此类格式没有什么特别的问题,但我们可能希望编码与解码能处于不同的领域。例如,我们可能会使用 API 发送一个 Unix 时间,并期待同样格式的响应。

精选