golang中方法定义取舍

golang中这两种方法的如何取舍选择,之间有什么区别func test(&post) error{}func test() (post Post, err error){}

学习golang期间看到有些内部方法是通过形参形式给参数赋值的,比如json.Unmarshal定义为

    func Unmarshal(data []byte, v interface{}) error {
    // Check for well-formedness.
    // Avoids filling out half a data structure
    // before discovering a JSON syntax error.
    var d decodeState
    err := checkValid(data, &d.scan)
    if err != nil {
        return err
    }

    d.init(data)
    return d.unmarshal(v)
}

为何不定义成如下这种方式

 func Unmarshal(data []byte) (v interface, err error){
    ……
}
阅读 2.5k
3 个回答

函数参数

func test(&post) error给与了一个具体的对象,通常用于需改等操作,例如 func UpdatePostInfo(&post) error

func test() (post Post, err error)没有给与具体的对象,通常用于new,例如func NewPostInfo() (post Post, err error)

请问v是什么类型?

func Unmarshal(data []byte) (v interface, err error)

json.Unmarshal传入的对象具有类型信息,例如实际的map和struct类型,才能根据需要反序列化的对象的全部属性来设置json的值,如果不传入类型信息,那么json库不知道该如何存储json信息。

传指针可以直接修改变量,用返回值的还有多一个拷贝。

Unmarshal 实际也是需要一个指针,然后可以写进变量里。用返回值就还得拷贝。

但是 golang 想表示任意类型的指针,只能 interface{} 了 ....

其实就是楼上说的原因,因为golang没有泛型,所有只能用interface来传递任意类型的参数。

json.Unmarshal 需要确定反序列化的对象的类型,所以要在传入参数中来传参。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏