#青训营笔记创作活动#
1月26日 day12
今日学习
说出一个避免Goroutine泄露的措施

可以通过 context 包来避免内存泄漏。
func main() { ctx, cancel := context.WithCancel(context.Background())
ch := func(ctx context.Context) <-chan int {
ch := make(chan int)
go func() {
for i := 0; ; i++ {
select { case <- ctx.Done():
return
case ch <- i: } } } ()
return ch }(ctx)
for v := range ch {
fmt.Println(v)
if v == 5 { cancel()
break } }}
下面的 for 循环停止取数据时,就用 cancel 函数,让另一个协程停止写数据。如果下面 for 已停止读取数据,上面 for 循环还在写入,就会造成内存泄漏。
如何跳出for select 循环
通常在for循环中,使用break可以跳出循环,但是注意在go语言中,for select配合时,break 并不能跳出循环。
func testSelectFor2(chExit chan bool){
EXIT: for { select { case v, ok := <-chExit:
if !ok { fmt.Println("close channel 2", v)
break EXIT//goto EXIT2 }
fmt.Println("ch2 val =", v)
} } //EXIT2: fmt.Println("exit testSelectFor2")}
展开
评论