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