前几天一个小伙伴在公司 slack 问到如下 Golang 代码为什么会卡死(Go Playground):
**package main
import (
"fmt"
"runtime")
func main() {
var i byte
go func() {
for i = 0; i <= 255; i++ {
}
}()
fmt.Println("Dropping mic")
// Yield execution to force executing other goroutines runtime.Gosched()
runtime.GC()
fmt.Println("Done")}**
这个问题很有意思,大概涉及到 Golang 中以下三个概念:
**.byte 是什么
.goroutine 如何调度
.Golang GC 时会发生什么**
本文尝试简单解释下为什么上面的程序会卡死。
首先,先看下 main 函数里启动的 goroutine 事实上是什么东西:
**var i bytego func() {
for i = 0; i <= 255; i++ {
}}()**
Golang 中,byte 其实被 alias 到 uint8 上了。所以上面的 for 循环会始终成立,因为 i++ 到
i=255 的时候会溢出,i <= 255 一定成立。也即是, for 循环永远无法退出,所以上面的代码其实可以等价于这样: