有用于包装初始化的内置init()函数。为什么不破坏呢?例如,我在程序包中初始化了一个goroutine池,并且希望该池中的所有goroutine在退出之前完成其任务,而不是在整个程序退出时被迫退出。
如果有fini功能。我可以使用sync.Wait在那里完成我的目标。
内置init的另一个优点是它只能被调用一次,如果我使用用户定义的函数替代它们,这将是我自己的担忧。
尝试以下代码:
package main
import (
"fmt"
"sync"
"time"
)
func main() {
defer fini()
wg.Add(1)
go routine()
fmt.Println("... in progress ... ")
}
func fini() {
wg.Wait()
fmt.Println("Done")
}
func init() {
fmt.Println("Hi")
}
func routine() {
fmt.Println("Doing somthing ...")
time.Sleep(1000 * time.Millisecond)
wg.Done()
}
var wg sync.WaitGroup
运行:
$ go run .
Hi
... in progress ...
Doing somthing ...
Done
在函数main中执行fini可以解决我的问题