github.com/maikovskiys/l1tasks@v0.0.0-20230927052451-6436d7687dc9/develop/dev06/main.go (about) 1 package main 2 3 import ( 4 "context" 5 "fmt" 6 "sync" 7 "time" 8 ) 9 10 /* 11 Реализовать все возможные способы остановки выполнения горутины. 12 */ 13 func main() { 14 wg := sync.WaitGroup{} 15 ctx, cancel := context.WithCancel(context.Background()) 16 ch := make(chan struct{}) 17 wg.Add(1) 18 go func(chan struct{}, context.Context) { 19 defer wg.Done() 20 counter := 0 21 for { 22 counter++ 23 var d struct{} 24 fmt.Println("g1 stopped after writing in chan") 25 time.Sleep(time.Second) 26 ch <- d 27 fmt.Println("g1 do next work") 28 if counter == 4 { 29 close(ch) 30 cancel() 31 break 32 } 33 } 34 fmt.Println("g1 work end") 35 }(ch, ctx) 36 37 wg.Add(1) 38 go func(context.Context) { 39 defer wg.Done() 40 fmt.Println("g2 stopped by select") 41 select { 42 case <-ctx.Done(): 43 fmt.Println("g2 select end") 44 break 45 } 46 fmt.Println("g2 do next work") 47 fmt.Println("g2 end ") 48 49 }(ctx) 50 wg.Add(1) 51 go func() { 52 defer wg.Done() 53 fmt.Println("g3 stopped for reading from ch") 54 for v := range ch { 55 _ = v 56 time.Sleep(3 * time.Second) 57 } 58 fmt.Println("g3 do next work") 59 fmt.Println("g3 work end") 60 }() 61 fmt.Println("main stopped by wg") 62 wg.Wait() 63 fmt.Println(" main do next work") 64 fmt.Println("main end ") 65 66 }