func Marshal(v interface{}) ([]byte, error)
func Unmarshal(data []byte, v interface{}) error
通知元帅接受的接口,并返回一个 []字节作为输出,而解组接受[]字节和直接写入输出到输入参数数据为什么json.Marshal和json.Unmarshal具有不同的签名
做什么设计
联营问题的区别:
我想使用的输入参数可以保存在内存中复制一次(乐趣ction return需要一个副本),golang中的每个赋值都是一个副本操作,所以看起来Unmarshal可以保存副本,但不是Marshal。
所以我很困惑...
没有去语言专家。但是,如果你将一些数据序列化(Marshall)成一个字节数组,大多数情况下事先并不知道字节数组的大小。因此,他们返回一个字节数组,其大小正确,而不是在函数参数列表中设计一个可以处理数组大小参数的接口。相反,Unmarshall(反序列化)需要一个字节数组(来自某个传输层),因此不存在这个问题。 – BitTickler 2014-09-27 02:04:48
@ user2225104谢谢 – Nowhy 2014-09-27 02:59:22
Unmarshal写入'v',而不是'data'。 'Marshal'可以接受一个输入字节片并返回一个(可能是重新分配的)带有JSON的字节片,如果先前alloc'd数组足够大,可能会避免分配。讨论过的人们使得Marshaler界面能够做到这一点,但认为它的好处并不值得。请注意,无论如何不会有JSON字节的副本; [切片(和字符串,和其他一些东西)包含指针](http://stackoverflow.com/questions/23542989/pointers-vs-values-in-parameters-and-return-values/23551970#23551970);复制它们不会复制内容。 – twotwotwo 2014-09-27 03:42:08