Golang 中的坑 一

时间:2021-06-03 09:51:38

Golang 中的坑

短变量声明  Short variable declarations

考虑如下代码:

package main

import (

"errors"

"fmt"

)

type MyObject struct {

Id string

Name string

}

func GetObjects() (objs []MyObject, err error) {

return nil, errors.New("get failed")

}

func Test() error {

return nil

}

func main() {

err := Test()

{

objs, err := GetObjects()

if err != nil {

goto ERROR

}

fmt.Println(objs)

}

return

ERROR:

fmt.Println(err)

}

运行后输出

<nil>

ERROR label处的err值为nil,嵌套作用域短变量声明重新声明了一份err,而不是使用外层已经存在的err。这有些违背大多人的直觉,并且给实际编码工作带来些不便。

看如下在beego中实现的业务代码:

func (this *VideoController) AddVideo() {

var rqst VideoRequst

var err error

if err = json.Unmarshal(this.Ctx.Input.RequestBody, &rqst); err != nil {

goto ERROR

} else {

if rqst.Data == nil {

err = errors.New("parse json failed")

goto ERROR

}

var id int32

id, err = models.AddVideo(*rqst.Data)

if err != nil {

goto ERROR

} else {

var rsp CommonAddResponse

rsp.Code = 0

rsp.Data.Id = id

bJson, _ := json.Marshal(rsp)

this.Ctx.Output.Body(bJson)

}

}

return

ERROR:

this.Ctx.Output.SetStatus(400)

var rsp CommonResponse

rsp.Code = -1

rsp.Data = err.Error()

bJson, _ := json.Marshal(rsp)

this.Ctx.Output.Body(bJson)

return

}

在内层作用域里涉及err的地方不能使用:=,否则错误处理时,err.Error()就会崩溃。

这绝对是很多初涉golang的人要踩的坑。