• Golang 中的坑 一


    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的人要踩的坑。

  • 相关阅读:
    jQuery基础
    前端武器库之DOM练习
    前端逼死强迫症之DOM
    前端武器库系列之html后台管理页面布局
    前端逼死强迫症系列之javascript续集
    初识elasticsearch_2(查询和整合springboot)
    初识elasticsearch_1(基本概念和基本操作)
    springboot整合redis(注解形式)
    springsecurity实战
    浅谈JavaSript中的this
  • 原文地址:https://www.cnblogs.com/majianguo/p/6763042.html
Copyright © 2020-2023  润新知