有了泛型,以前一直想做的 Go 错误处理终于可以实现了

2023-03-06 10:28:59 +08:00
 SuperMild

有些错误不需要特殊处理,就能用这些简单方便的函数,有错误就 panic, 无错误就直接返回有用结果:

func Try(err error) {
	if err != nil {
		panic(err)
	}
}

func Try1[V any](val V, err error) V {
	Try(err)
	return val
}

func Try2[V1 any, V2 any](val1 V1, val2 V2, err error) (V1, V2) {
	Try(err)
	return val1, val2
}

一个例子:

// 不使用泛型的传统实现
func GetExePath() string {
	path, err := os.Executable()
	if err != nil {
		panic(err)
	}
	return path
}
// 使用泛型,告别 `if err != nil`
func GetExePath() string {
	return Try1(os.Executable())
}
6768 次点击
所在节点    Go 编程语言
46 条回复
sunny1688
2023-03-06 10:35:41 +08:00
比 interface{}强一点
cnbattle
2023-03-06 10:36:24 +08:00
不喜欢 panic 0.0
Nazz
2023-03-06 10:38:00 +08:00
看起来还不错
rrfeng
2023-03-06 10:38:41 +08:00
但是大部分时候不想 panic ,还是得造个 Option 好用
yyf1234
2023-03-06 10:41:48 +08:00
写过实际业务没大哥,线上也直接 panic 吗
yzbythesea
2023-03-06 10:42:41 +08:00
panic 是高手
voidmnwzp
2023-03-06 10:44:17 +08:00
又在玩 java try catch 那套是吧 建议去写 Java
fengjianxinghun
2023-03-06 10:44:42 +08:00
。。。。any 不就是 interface{}别名么。。
chiuan
2023-03-06 10:46:45 +08:00
又把多态那些搞进来了吗?
lance6716
2023-03-06 10:47:03 +08:00
一般叫 must ,你这个跟 try 有一毛钱关系吗
SuperMild
2023-03-06 10:48:40 +08:00
@yyf1234 有使用场景的,你看看这个很流行的库也提供了这个函数 https://github.com/samber/lo#must

Must
Wraps a function call to panics if second argument is error or false, returns the value otherwise.
sunny1688
2023-03-06 10:50:08 +08:00
@fengjianxinghun interface{}要转类型,泛型不用
rrfeng
2023-03-06 10:50:16 +08:00
楼上说的对,Go 里会写一个 MustXXX() 用来 panic ,比你这个 Try 好。

本身也就是多几行而已

func XXX(){}
func MustXXX(){
if XXX() != nil { panic() }
}
SuperMild
2023-03-06 10:51:06 +08:00
@fengjianxinghun 泛型是天生类型安全的,interface{}要自己写一堆判断才能确保类型安全。
SuperMild
2023-03-06 10:52:58 +08:00
@lance6716
@rrfeng

确实,我这个函数名搞错了。原本我用的函数名是 Panic, 但看着太让人紧张于是改成 Try 。然后刚刚才知道有 lo 这个库。
dw2693734d
2023-03-06 10:59:55 +08:00
@yyf1234 我就是线上 panic😂,受了 erlang 的 let it crash 的影响
yyf1234
2023-03-06 11:09:17 +08:00
@dw2693734d
@SuperMild
MustXXX() 一般在启动时检查配置用吧,业务里面可别 panic
SuperMild
2023-03-06 11:15:14 +08:00
@yyf1234 对。

另外有时候时间紧或者写 demo 的时候就先 panic 偷懒,后续再好好处理错误,反正有 web 框架兜底,程序不会真的崩,向前端返回 500 而已。
wtfedc
2023-03-06 11:38:57 +08:00
500 和程序崩也一样,nginx 也是返回 502
Jaron0608
2023-03-06 12:15:15 +08:00
@wtfedc 这里的程序崩是说整个进程退出,影响了其他接口的正常使用

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/921483

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX