You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							53 lines
						
					
					
						
							901 B
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							53 lines
						
					
					
						
							901 B
						
					
					
				| package util | |
| 
 | |
| import ( | |
| 	"compress/gzip" | |
| 	"fmt" | |
| 	"io" | |
| 	"sync" | |
| ) | |
| 
 | |
| var ( | |
| 	gzipReaderPool = sync.Pool{ | |
| 		New: func() interface{} { | |
| 			return new(gzip.Reader) | |
| 			//return gzip.NewReader() | |
| 		}, | |
| 	} | |
| 
 | |
| 	gzipWriterPool = sync.Pool{ | |
| 		New: func() interface{} { | |
| 			w, _ := gzip.NewWriterLevel(nil, gzip.BestSpeed) | |
| 			return w | |
| 		}, | |
| 	} | |
| ) | |
| 
 | |
| func GzipStream(w io.Writer, r io.Reader) (int64, error) { | |
| 	gw, ok := gzipWriterPool.Get().(*gzip.Writer) | |
| 	if !ok { | |
| 		return 0, fmt.Errorf("gzip: new writer error") | |
| 	} | |
| 	gw.Reset(w) | |
| 	defer func() { | |
| 		gw.Close() | |
| 		gzipWriterPool.Put(gw) | |
| 	}() | |
| 	return io.Copy(gw, r) | |
| } | |
| 
 | |
| func GunzipStream(w io.Writer, r io.Reader) (int64, error) { | |
| 	gr, ok := gzipReaderPool.Get().(*gzip.Reader) | |
| 	if !ok { | |
| 		return 0, fmt.Errorf("gzip: new reader error") | |
| 	} | |
| 
 | |
| 	if err := gr.Reset(r); err != nil { | |
| 		return 0, err | |
| 	} | |
| 	defer func() { | |
| 		gr.Close() | |
| 		gzipReaderPool.Put(gr) | |
| 	}() | |
| 	return io.Copy(w, gr) | |
| }
 |