golang学习笔记——context库


WithCancel(主进程控制子协程关闭) package main   import (     "context"     "fmt"     "sync"     "time" )   var wg sync.WaitGroup   func f(ctx context.Context) {     defer wg.Done()     LOOP:     for {          fmt.Println("hello world")          time.Sleep(time.Millisecond * 500)          select {          case <-ctx.Done():                  break LOOP          default:          }     } }   func main() {     ctx, cancel := context.WithCancel(context.Background())     wg.Add(1)     go f(ctx)     time.Sleep(time.Second * 5)     //通知子协程退出     cancel()     wg.Wait() }   WithTimeout(超时关闭) package main   import (     "context"     "fmt"     "sync"     "time" )   var wg sync.WaitGroup   func f(ctx context.Context) {     defer wg.Done()     LOOP:     for {          fmt.Println("hello world")          time.Sleep(time.Millisecond * 500)          select {          case <-ctx.Done(): //50毫秒自动调用                  break LOOP          default:          }     } }   func main() {     ctx, cancel := context.WithTimeout(context.Background(), 50*time.Millisecond)     //通知子协程退出     defer cancel()     wg.Add(1)     go f(ctx)     time.Sleep(time.Second * 5)     wg.Wait() }   WithValue (key值不能为基础类型,应该用用户自定义的类型 package main   import (     "context"     "fmt"     "sync"     "time" )   type cjp string   var wg sync.WaitGroup   func f(ctx context.Context) {     defer wg.Done()     LOOP:     for {          fmt.Println(ctx.Value(cjp("mt")))          fmt.Println("hello world")          time.Sleep(time.Millisecond * 500)          select {          case <-ctx.Done(): //50毫秒自动调用                  break LOOP          default:          }     } }   func main() {     ctx, cancel := context.WithTimeout(context.Background(), 50*time.Millisecond)     defer cancel()     ctx = context.WithValue(ctx, cjp("mt"), "cuijiapeng")     wg.Add(1)     go f(ctx)     time.Sleep(time.Second * 5)     wg.Wait() }