gpt4 book ai didi

go - 为什么 json.Marshal 和 json.Unmarshal 有不同的签名

转载 作者:数据小太阳 更新时间:2023-10-29 03:07:20 27 4
gpt4 key购买 nike

func Marshal(v interface{}) ([]byte, error)
func Unmarshal(data []byte, v interface{}) error

注意 Marshal 接受一个接口(interface)并返回一个 []byte 作为输出,而 Unmarshal 接受一个 []byte 并将输出直接写入输入参数数据

是什么让设计与众不同

相关问题:

我认为使用输入参数可以在内存中保存一次(函数返回需要一个副本),golang中的每个赋值都是一个复制操作,所以看起来Unmarshal可以保存一个副本,但Marshal不能。

所以我很困惑......

最佳答案

对称对中的潜在函数是:

func Marshal(v interface{}) ([]byte, error)         // 1
func Unmarshal(data []byte) (interface{}, error) // 2

func Marshal(v interface{}, data *[]byte) error // 3
func Unmarshal(data []byte, v interface{}) error // 4

函数 #3 和 #4 可能看起来不对称,因为 #3 的 data 参数是指针类型,而 #4 的 v 参数未声明为一个指针类型。它们实际上是对称的,因为传递给 #4 的 v 参数的实际值必须是一个指针。如果不是指针,该函数将返回错误。

函数 #2 不可行,因为该函数无权访问应用程序的结果类型。如果该函数不知道该类型,则该函数无法将 JSON 解码为该类型。此外,应用程序需要键入断言结果才能使用它。标准库尽可能避免类型断言。

函数 #3 不是惯用的。在 Go 中很少使用指向 slice 的指针。我不记得在标准库中使用过任何东西,但我相信如果有的话,有人会在这里发表评论。

我们留下了#1 和#4 的不对称对:

func Marshal(v interface{}) ([]byte, error)         // 1
func Unmarshal(data []byte, interface{}) error // 4

关于go - 为什么 json.Marshal 和 json.Unmarshal 有不同的签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26070528/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com