funcmain(){r:=strings.NewReader("some io.Reader stream to be read\n")pr,pw:=io.Pipe()tee:=io.TeeReader(r,pw)// create channel to synchronize
done:=make(chanbool)deferclose(done)printall:=func(rio.Reader){b,err:=ioutil.ReadAll(r)iferr!=nil{log.Fatal(err)}fmt.Printf("%+v: %s",reflect.TypeOf(r),b)}deferpw.Close()printall(tee)printall(pr)}
funcmain(){r:=strings.NewReader("some io.Reader stream to be read\n")pr,pw:=io.Pipe()tee:=io.TeeReader(r,pw)// create channel to synchronize
done:=make(chanbool)deferclose(done)printall:=func(rio.Reader){b,err:=ioutil.ReadAll(r)iferr!=nil{log.Fatal(err)}fmt.Printf("%+v: %s",reflect.TypeOf(r),b)}gofunc(){printall(pr)done<-true}()gofunc(){deferpw.Close()printall(tee)done<-true}()// wait until both are done
forc:=0;c<2;c++{<-done}}
done chan 被添加以此来确保同步能够正确地发生,即在main线程退出之前。
pw.Close()必须要和printall(tr)放在另一个goroutine内部。这是因为TeeReader会返回一个将 r 中的数据读出后同时写入 w 的Reader中。