package main
import("context""fmt""io/ioutil""net/http""time")// 自定义结构type Result struct{
r *http.Response
err error}// 延时处理funcprocess(){// 上下文
ctx, cancel := context.WithTimeout(context.Background(),2*time.Second)defercancel()
tr :=&http.Transport{}// 客户端
client :=&http.Client{Transport: tr}// 管道用于处理延时
c :=make(chan Result,1)// 建立请求
req, err := http.NewRequest("GET","http://www.geogle.com",nil)if err !=nil{
fmt.Println("http request failed, err:", err)return}// 做请求,结果放进通道gofunc(){
resp, err := client.Do(req)
pack := Result{r: resp, err: err}
c <- pack
}()// 2种类型,延时后还没做则取消,否则读出结果select{case<-ctx.Done():
tr.CancelRequest(req)
res :=<-c
fmt.Println("Timeout! err:", res.err)case res :=<-c:defer res.r.Body.Close()
out,_:= ioutil.ReadAll(res.r.Body)
fmt.Printf("Server Response: %s", out)}return}funcmain(){process()}
context.Context
package main
import("context""fmt")// context.Context key-val的使用funcprocess(ctx context.Context){
ret, ok := ctx.Value("trace_id").(int)if!ok {
ret =21342423}
fmt.Printf("ret:%d\n", ret)
s,_:= ctx.Value("session").(string)
fmt.Printf("session:%s\n", s)}funcmain(){
ctx := context.WithValue(context.Background(),"trace_id",13483434)
ctx = context.WithValue(ctx,"session","sdlkfjkaslfsalfsafjalskfj")process(ctx)}
主线程等待全部子线程结束的方法
package main
import("fmt""sync""time")funcmain(){
wg := sync.WaitGroup{}for i :=0; i <10; i++{
wg.Add(1)gocalc(&wg, i)}
wg.Wait()
fmt.Println("all goroutine finish")}funccalc(w *sync.WaitGroup, i int){
fmt.Println("calc:", i)
time.Sleep(time.Second)
w.Done()}