网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
这是一个误区。
throw
第三种是 Go 初学者经常踩坑,也不知道的错误类型,那就是致命错误 throw。
这个错误类型,在用户侧是没法主动调用的,均为 Go 底层自行调用的,像是大家常见的 map 并发读写,就是由此触发。
其源码如下:
func throw(s string) {
systemstack(func() {
print("fatal error: ", s, “\n”)
})
gp := getg()
if gp.m.throwing == 0 {
gp.m.throwing = 1
}
fatalthrow()
*(*int)(nil) = 0 // not reached
}
复制代码
根据上述程序,会获取当前 G 的实例,并设置其 M 的 throwing 状态为 1。
状态设置好后,会调用 fatalthrow
方法进行真正的 crash 相关操作:
func fatalthrow() {
pc := getcallerpc()
sp := getcallersp()
gp := getg()
systemstack(func() {
startpanic_m()
if dopanic_m(gp, pc, sp) {
crash()
}
exit(2)
})
*(*int)(nil) = 0 // not reached
}
复制代码
主体逻辑是发送 _SIGABRT
信号量,最后调用 exit
方法退出,所以你会发现这是拦也拦不住的 “致命” 错误。
致命场景
为此,作为一名 “成熟” 的 Go 工程师,除了保障自己程序的健壮性外,我也在网上收集了一些致命的错误场景,分享给大家。
一起学习和规避这些致命场景,年底争取拿个 A,不要背上 P0 事故。
并发读写 map
func foo() {
m := map[string]int{}
go func() {
for {
m[“煎鱼1”] = 1
}
}()
for {
_ = m[“煎鱼2”]
}
}
复制代码
输出结果:
fatal error: concurrent map read and map write
goroutine 1 [running]:
runtime.throw(0x1078103, 0x21)
…
复制代码
堆栈内存耗尽
func foo() {
var f func(a [1000]int64)
f = func(a [1000]int64) {
f(a)
}
f([1000]int64{})
}
复制代码
输出结果:
runtime: goroutine stack exceeds 1000000000-byte limit
runtime: sp=0xc0200e1bf0 stack=[0xc0200e0000, 0xc0400e0000]
fatal error: stack overflow
runtime stack:
runtime.throw(0x1074ba3, 0xe)
/usr/local/Cellar/go/1.16.6/libexec/src/runtime/panic.go:1117 +0x72
runtime.newstack()
…
复制代码
将 nil 函数作为 goroutine 启动
func foo() {
var f func()
go f()
}
复制代码
输出结果:
fatal error: go of nil func value
goroutine 1 [running]:
main.foo()
…
复制代码
goroutines 死锁
func foo() {
select {}
}
复制代码
输出结果:
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [select (no cases)]:
main.foo()
…
复制代码
线程限制耗尽
如果你的 goroutines 被 IO 操作阻塞了,新的线程可能会被启动来执行你的其他 goroutines。
Go 的最大的线程数是有默认限制的,如果达到了这个限制,你的应用程序就会崩溃。
会出现如下输出结果:
fatal error: thread exhaustion
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
-
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
- thread exhaustion
[外链图片转存中…(img-Nqc3Vpwl-1715565901887)]
[外链图片转存中…(img-EQDLRWOL-1715565901887)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!