看到好多人吐槽 golang 的错误处理,但我用的很爽啊

dafsic:golang 的错误处理,我之前也吐槽,但从 1.13 开始吧就挺好用了。
之前吐槽点:

  1. 如果底层函数出错,只在上层打印错误信息,会丢失调用栈,不知道最开始的错误发生在哪里。
  2. 如果通过字符串追加的方式,加入调用栈信息,那么错误类型会丢失,无法像 if err == io.EOF 这样判断是什么错误。

现在已经不是问题了。

// LineInfo 返回调用此函数的代码所在函数、文件、行号
// 此函数应该在一个单独的文件中,比如,utils/getlineinfo.go
func LineInfo() string {
	function := "xxx"
	pc, file, line, ok := runtime.Caller(1)
	if !ok {
		file = "???"
		line = 0
	}
	function = runtime.FuncForPC(pc).Name()
	return fmt.Sprintf(" -> %s():%s:%d", function, file, line)
}

var ErrAuth = errors.New("auth error")
var ErrAccount = fmt.Errorf("%w: account not exist", ErrAuth)
var ErrPassword = fmt.Errorf("%w: incorrect password", ErrAuth)

func login(acc, pwd string) (string, error) {
	if acc != "libai" {
		return "", ErrAccount
	}
	if pwd != "123456" {
		return "", ErrPassword
	}

	return fmt.Sprintf("key:AC34cvG-%d", time.Now().Unix()), nil
}

func getInfo(acc, pwd string) (string, error) {
	key, err := login(acc, pwd)
	if err != nil { // login 的错误
		return "", fmt.Errorf("%w%s", err, LineInfo())
	}

	// 打开下面的注释就会是 key 过期
	//time.Sleep(time.Second)

	msg, err := getIntro(key)
	if err != nil { // key 错误
		return "", fmt.Errorf("%w%s", err, LineInfo())
	}

	return msg, nil
}

var ErrKey = errors.New("invalid key")

func getIntro(key string) (string, error) {
	if key != fmt.Sprintf("key:AC34cvG-%d", time.Now().Unix()) {
		return "", ErrKey
	}

	return "李白,号青莲居士", nil
}

func main() {
	info, err := getInfo("libai", "123456")
	if err != nil && errors.Is(err, ErrAuth) { // 无论账号错误还是密码错误,都是认证错误
		fmt.Printf("[info]%s\n", err.Error())
	} else if err != nil {
		fmt.Printf("[error]:%s\n", err.Error())
	}

	fmt.Println(info)
}

ruanimal:不可否认,if err != nil 导致代码的可读性变差,异常处理的逻辑和业务逻辑代码混杂在一起

z0wjqnxi:你说的两个点,第三方的 errors 包都已经足够好用,现在的版本,go 自带的 error.Is(), 判断错误类型也够用了。

我觉得现在最大的痛点应该是要写一堆‘ if err!= nil {}’ ,代码块里可能有很多重复的错误处理逻辑还不好抽离封装, 为了少写这些重复逻辑,社区许多人推荐用 defer,现在我偶尔用 goto 。

sryanyuan:写惯 c/c++的表示错误码很正常,普通错误,比如文件找不着这种,不算异常,就返回一个 errorcode 上层继续处理,程序可以继续正常运行
碰到各种异常,直接崩溃了就得了

golang 里面全局匿名变量的作用是啥?

iCD:看到过好几次别人的代码里面都有全局的匿名变量,比如这里: ... type cachedWriter struct { gin.ResponseWriter status int written bool store persistence.CacheStore expire time.Duration key string } var _ gin.…

有比较好用的 Node 或者 Golang 的开源论坛程序推荐么?

w3cfed:感谢大神们丫。推荐一下呗。

[北京-Aibee][内推] 2020 年,我们急求 Golang 开发工程师,待遇优厚,入职快!

lyrictian:公司简介 Aibee,由林元庆博士(前百度研究院院长)于 2017 年 11 月创立,是中国领先的人工智能(AI)整体解决方案创新企业,其使命是利用 AI 技术赋能升级传统行业,截止目前,Aibee 已向线下零售、旅游等传统行业提供了 AI 整体解决方案。 职位描述 后端工程师 负责 AI 平台基础架构的开发和维护,支持业务的快速落地。 …

[社招] [百度] 大数据平台计算产品研发/ Java /Golang 工程师

gtchaos:BaiduMapReduce 研发工程师工作职责:大数据平台产品 BMR 的设计,研发,维护完备 BMR 组件( Hadoop/Spark/Hive/HDFS/Oozie/Jupyter/Presto 等),同步社区进展优化 BMR 稳定性、性能、弹性、易用性将 BMR 打造成国内同类产品第一职位要求:本科及以上学历,计算机及相关专业熟悉 J…

[18-35K] 涂鸦智能 - Erlang/Golang/C++ 工程师 [杭州] [物联网 IOT 独角兽]

GilbertWong0096:职位诱惑:五险一金,精英团队,行业前景好 职位描述:岗位职责:1. 负责物联网各类网关产品,目前组内使用的语言有 golang, erlang, c 等。2. 日常性能调优和云端与设备端等问题定位和修复。3. 有必要的情况下,需要辅导实习生或新员工。岗位要求:1. 本科或以上学历,计算机专业或软件工程等专业;2. 1 ~ 2 …