协程定义&&理解: (历史背景,底层逻辑,理解)
goRoutine
channel定义&&理解:
当遇到开启协程取channel,使用for select读取,还是for-range读取:
for-select需要注意routine关闭,否则造成内存泄漏,除非main接触,否则协程方法/实例方法没有办法被gc回收
for-range只需要保证channel被关闭,即可退出,不会造成routine不退出导致的内存泄露
func main() {
sta := state{
ch: make(chan int),
}
wg := sync.WaitGroup{}
wg.Add(1)
sta.run(&wg)
sta.ch <- 1
close(sta.ch)
wg.Wait()
}
type state struct {
ch chan int
}
func (s *state) run(wg *sync.WaitGroup) {
go func() {
for range s.ch {
y := 1
fmt.Println(y)
time.Sleep(1 * time.Second)
}
fmt.Println("done")
wg.Done()
}()
}
in process...