写代码遇到坑,就像:
我们带着耳机听着歌,走在阳光正好的大道上,突然脚下一沉,一阵失重感,完了,我又掉坑了。
今天我们就一起来盘点下,那些年我们踩过的坑!
一、我哪里错了?Error信息不全
官方的 error 包,抛出错误后,只有一句错误信息,别的信息都没有。
当你看到一堆的错误日志,你一定会问自己,哪里错了。
我想告诉你,你没错,错的是 error 包,你把它换了,使用 github.com/pkg/errors 就好了呀。
来,上代码:
代码语言:javascript复制func MyError(a int) error {
if a < 0 {
return errors.New("参数不能小于0")
}
return nil
}
func main(){
err := MyError(-4)
fmt.Printf("% v n", err)
}
// 输出结果
参数不能小于0
main.MyError
/Users/kun/Desktop/课件/design/ref/main.go:100
main.main
/Users/kun/Desktop/课件/design/ref/main.go:92
runtime.main
/usr/local/go/src/runtime/proc.go:255
runtime.goexit
/usr/local/go/src/runtime/asm_amd64.s:1581
是不是挺像 panic
的错误异常哇,没错,没错,堆栈的外衣都出来了。
如果你正常打印这个 err 只会得到 err 的错误信息。
其原理是,这个包,他实现了Format方法:
这个方法他可以在 fmt 包,传入不同参数,输出不同结果。
没错 stack 就是错误的堆栈信息。
快去试试吧!
二、一连串的参数,头大
我不知道大家有没有遇到过,在调用某个库的方法时,参数 5 6 个的那种,有些还不是必填那种。
这也是一个非常让人头大的现象,而且这种参数顺序往往是不能乱的。
上代码:
代码语言:javascript复制func GetUserList(page, pageSize, userType, userStatic int, userFrom string) {
//page 分页
//pageSize 每页取的数量 【非必传】
//userType 用户类型 【非必传】
//userStatic 用户状态 【非必传】
//userFrom 用户来源 【非必传】
//....具体逻辑省略
}
就问你看到怕不怕,某些参数还不是非必传。
我们使用时就得这样调用:
代码语言:javascript复制GetUserList(1,10, "","", "")
好了,我已经听到你想骂他的心理活动了。
面对如此情况,我们建议是使用 Option 方法去写!
一般参数超过一定数量,就建议使用 Option 这样的方式去处理:
代码语言:javascript复制type GetUserListOption struct {
PageSize int
UserType string
UserStatic string
UserFrom string
}
func GetUserList(page int, option *GetUserListOption) {
// 只保留了必要参数,其他参数收到option里面
if option==nil {
// 走默认
}
}
这样只保留必要参数在外面,其他全给收到 Option 里面,是不是可读性和可扩展性一下就高了许多。