Go开发中这些头大的坑你踩了几个?

2022-08-31 11:40:38 浏览数 (2)

写代码遇到坑,就像:

我们带着耳机听着歌,走在阳光正好的大道上,突然脚下一沉,一阵失重感,完了,我又掉坑了。

今天我们就一起来盘点下,那些年我们踩过的坑!

一、我哪里错了?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 里面,是不是可读性和可扩展性一下就高了许多。

0 人点赞