package main import "fmt" func test() { defer fmt.Println("cccccccccccc")//在函数退出前执行 fmt.Println("ddddddddddddddd") } func main() { go func() { fmt.Println("aaaaaaaaaaaaaaaaaa") test() fmt.Println("bbbbbbbbbbbbbbbbb") }() for true { } }
这里执行的结果为
aaaaaaaaaaaaaaaaaa
ddddddddddddddd
cccccccccccc
bbbbbbbbbbbbbbbbb
但是如果在defer fmt.Println("cccccccccccc")的下面加一句return呢?
... func test() { defer fmt.Println("cccccccccccc")//在函数退出前执行 return fmt.Println("ddddddddddddddd") } ...
那么执行结果就是
aaaaaaaaaaaaaaaaa
cccccccccccc
bbbbbbbbbbbbbbbbb
return的意思是终止此函数,那么在终止前又有一个defer所以才会打印ccccccccc,那么dddddddddddd自然不会被执行
下面我们的goexit出场
package main
import (
"fmt"
"runtime"
)
func test() {
defer fmt.Println("cccccccccccc")//在函数退出前执行
//return
runtime.Goexit() //退出所在子协程
fmt.Println("ddddddddddddddd")
}
func main() {
go func() {
fmt.Println("aaaaaaaaaaaaaaaaaa")
test()
fmt.Println("bbbbbbbbbbbbbbbbb")
}()
for true {
}
}
那么执行结果就是
aaaaaaaaaaaaaaaaaa
cccccccccccc
因为goexit的意思的退出所在子协程,所以连bbbbbbbbb都不会被打印了