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的人要踩的坑。
Golang 中的坑 一的更多相关文章
- Golang中的坑二
Golang中的坑二 for ...range 最近两周用Golang做项目,编写web服务,两周时间写了大概五千行代码(业务代码加单元测试用例代码).用Go的感觉很爽,编码效率高,运行效率也不错,用 ...
- Golang中WaitGroup使用的一点坑
Golang中WaitGroup使用的一点坑 Golang 中的 WaitGroup 一直是同步 goroutine 的推荐实践.自己用了两年多也没遇到过什么问题.直到一天午睡后,同事扔过来一段奇怪的 ...
- Golang的防坑小技巧
Golang的防坑小技巧 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 作为一名小白,在之前没有接触到编程的小伙伴,难免会踩到一些坑,比如说刚刚入门的时候你需要安装环境,学习Gol ...
- 【荐】详解 golang 中的 interface 和 nil
golang 的 nil 在概念上和其它语言的 null.None.nil.NULL一样,都指代零值或空值.nil 是预先说明的标识符,也即通常意义上的关键字.在 golang 中,nil 只能赋值给 ...
- Golang 中使用多维 map
http://tnt.wicast.tk/2015/11/02/golang-multiple-dimension-map/ Golang 的 XML/JSON 解析库乍看使用起来很方便,只要构造一样 ...
- Golang 中操作 Mongo Update 的方法
Golang 和 MongoDB 中的 ISODate 时间交互问题 2018年02月27日 11:28:43 独一无二的小个性 阅读数:357 标签: GolangMongoDB时间交互时间转换 更 ...
- golang中,slice的几个易混淆点
slice在golang中是最常用的类型,一般可以把它作为数组使用,但是比数组要高效呀.不过,我感觉这个东西用的不好坑太多了.还是需要了解下他底层的实现 slice的结构定义 type slice s ...
- 初学者学习golang可能遇到的坑
我也是个golang初学者,刚入门的话,有些"坑"还是不好发现的.如map只是定义了然后就拿来使用,变量的值覆盖等. 本来打算写一篇的,后面发现有人写的挺不错的,我就把里面的有些坑 ...
- python golang中grpc 使用示例代码详解
python 1.使用前准备,安装这三个库 pip install grpcio pip install protobuf pip install grpcio_tools 2.建立一个proto文件 ...
随机推荐
- Servlet之过滤器(Filter)和监听器(Listener)
过滤器 过滤器是一个java组件,可以拦截发送至某个servelet,jsp页面或静态页面的请求,可以在响应发送到客户之前进行拦截 工作原理: 过滤器类必须实现 Filter 接口,包含的方法如下: ...
- 【转】如何使用Git上传本地项目到github?(mac版)
原文链接:http://www.cnblogs.com/lijiayi/p/pushtogithub.html 在此假设你已经在 github 上创建好了一个项目,像这样: 并且你已经完成了自己的项目 ...
- golang关于一些新手不注意会出现的小问题
前言 最近在整理之前写程序,学习时所记录的有道云笔记,发现一些有意思的小点跟大家分享一下.如有错误请大家给指出 一.闭包 defer 闭包(匿名函数) func test(){ i, n := ,; ...
- 基本MarkDown语法
引言 字符串作为一种常见的数据类型,在日常中我们面临各式各样的字符串处理问题,那么,这就要求我们必须掌握一些常用的字符串处理函数.本文尽量囊括常用的字符串处理函数,此文也作为个人的小总结. Pytho ...
- C#_表达式目录树的应用
使用表达式目录树实现两个不同类型的属性赋值: public class People { public int Age { get; set; } public string Name { get; ...
- DDD峰会归来话DDD
一场大戏落幕,首届DDD中国峰会如大会主题色一般的红.或许在12月9日这一天,全中国的DDD粉丝大约有一半都汇聚在了国家会议中心.听起来是幸,其实是不幸,因为DDD在中国的人群基数实在是太少了. 因为 ...
- 速微共享链的使用步骤和源码分析(UI设计参考)
一.速微共享链引言 速微共享链Service服务是Android四大组件之一,在Android中有着举足重轻的作用.Service服务是工作的UI线程中,当你的应用需要下载一个文件或者播放音乐等长期处 ...
- Ext.chart.Chart 显示图标 -- 本地数据
先来张直观的图,基于ext4.2制作 这就是弹出来的图表了. 今天先搭建一个本地数据版,也是静态数据版. 点击一个按钮执行一个function,来看function里面的东西: 一.依赖 Ext.re ...
- C++map类型 之 简单介绍
一:map的前世今生 (1)从关联容器与顺序容器说起.关联容器通过键(key)存储和读取元素.而顺序容器则通过元素在容器中的位置顺序存储和訪问元素(vector,queue,stack,list等). ...
- Hibernate的load()和get()区别
最近在用Hibernate的时候发现一个问题:比如我们从数据库获得一个对象时,使用session.get()方法还是session.load()? 两种方法在获得一个实体对象时是有区别的,在查询性能 ...