23|函数:怎么让函数更简洁健壮?
该思维导图由 AI 生成,仅供参考
健壮性的“三不要”原则
- 深入了解
- 翻译
- 解释
- 总结
Go函数设计需要考虑健壮性与简洁优雅。本文深入讨论了Go函数设计中的健壮性与异常处理,强调了评估程序对panic的忍受度的重要性,以及使用panic提示潜在bug的方法。此外,文章介绍了defer的运作机制和使用注意事项,以及对Go函数设计和实现的简化作用。通过具体的代码示例和对比分析,读者可以获得宝贵的设计原则和实践建议,包括如何评估程序对panic的忍受度、使用panic提示潜在bug以及避免混淆异常与错误的重要性。此外,文章还提到了Go 1.17版本中defer的性能优化,使得其开销几乎可以忽略不计。总之,本文为读者提供了关于Go函数设计的重要原则和实用技巧,对于开发人员在实际开发中提供了有益的指导和启发。
《Tony Bai · Go 语言第一课》,新⼈⾸单¥59
全部留言(32)
- 最新
- 精选
- 进化菌panic 恐慌,慌慌张张的抛出异常;recover 恢复,淡定还有事情要做,先别退出;defer 延迟,晚点要做的事情不能忘……
作者回复: 👍
2021-12-06223 - helloxiaomindefer的使用技巧:1)defer要在panic之前,才能执行;2)defer内部的recover只能捕获当前协程的Panic,不能跨协程执行;3)recover只能在defer中调用才能生效。暂时想到这些
作者回复: 👍
2021-12-0716 - return老师讲的太好了, 再请教一下老师, panic应该在什么场景下使用, 感觉平时 业务代码 使用 err足够,没有使用panic的场景, 文中举例的 http server比较合适, 但是json encode,虽然官方用了panic,但是个人感觉 使用err也没毛病, 传入的 json串 有问题嘛,就是 入参校验err呗。 所以 get 不到 什么情况下用 panic。
作者回复: 如果在平时panic用的,那么就说明你走在了正确的道路上:)。panic本身就是异常,异常本身就是很少发生的。目前看panic最常使用的就是充当“断言”,提示潜在bug时用的最多。
2021-12-06514 - liaomars看了官方标准库的defer说明,发现一个tips是:可以跟踪函数的执行过程
作者回复: 可以的。在后面的一个实战项目中,我们就会应用到这一点。
2021-12-06311 - 奕请教一个非课程的问题: v := [...]int{1: 2, 3: 4} fmt.Println(len(v)) 这里为什么打印出来的 长度是 4呢?
作者回复: 这是一种通过数组下标方式对数组进行初始化的方式。我记得我在第15讲中提到过吧。这里数组字面值中最大的下标值为3,go编译器就认为数组长度是4.(下标值范围0~3)
2021-12-0768 - lesserror感谢 Tony Bai 老师关于defer的深入讲解,不过我想问一下,在for中使用defer函数,编辑器会提示可能造成资源泄露,能大致说明一下这块儿的知识吗?
作者回复: defer是在函数退出时调用的。如果在for语句的每个迭代都使用defer设置deferred函数,这些deferred函数会压入runtime实现的defer列表中。会占用内存资源,并且如果for的loop次数很多,这个消耗将很可观。文中在for中使用defer仅是为了举例而已。生产代码这块的确要谨慎,通常是没有必要这么做的。
2021-12-0725 - vanpanic作为断言使用,上一层的调用者还是需要自己recover回来吧,不然这个调用链会最终传到main函数
作者回复: 把panic当做断言使用的目的是及早发现bug,一旦断言发生,意味着整个程序出现了不可恢复的状态。对于这类panic,不要recover。尽早失败并解决bug。所以在什么位置进行断言,对哪些条件进行断言是需要考量的。在C语言中使用assert也是同样的道理。一旦assert失败,便会dump core文件。程序终止。
2022-04-283 - ゝ骑着小车去兜风。老师你好,没太明白闭包的原理,想不明白为什么输出的是4,请帮忙解答下
作者回复: 循环结束后,i的值为4. defer输出的是i的值,于是就都是4.
2022-01-0633 - 功夫熊猫defer数据库的开关。锁的申请释放。TCP的连接和断开之类的
作者回复: 👍
2021-12-113 - 宋世杰Defer函数被放在一个不同于主函数的函数栈中吗? 是用slice实现的吗?
作者回复: 是go runtime层实现的。
2021-12-0643