zoukankan      html  css  js  c++  java
  • 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的人要踩的坑。

  • 相关阅读:
    [USACO5.3]校园网Network of Schools
    [USACO13OPEN]照片Photo

    flask的orm框架----------Flask-SQLAlchemy应用
    Flask-session用法
    flask--自定义auth模块
    flask -falsk_script用法
    Flask-SQLAlchemy数据库
    flask--session源码解析
    flask-源码请求源码
  • 原文地址:https://www.cnblogs.com/majianguo/p/6763042.html
Copyright © 2011-2022 走看看