globocom/go-buffer

GitHub: globocom/go-buffer

Stars: 28 | Forks: 8

# go-buffer `go-buffer` represents a buffer that asynchronously flushes its contents. It is useful for applications that need to aggregate data before writing it to an external storage. A buffer is flushed manually, or automatically when it becomes full or after an interval has elapsed, whichever comes first. ## Installation go get github.com/globocom/go-buffer Go < 1.18: go get github.com/globocom/go-buffer@v2 ## Examples ### Size-triggered flush package main import ( "time" "github.com/globocom/go-buffer/v3" ) func main() { buff := buffer.New( // call this function when the buffer needs flushing func(items []string) { for _, item := range items { println(string) } }, // buffer can hold up to 5 items buffer.WithSize(5), ) // ensure the buffer defer buff.Close() buff.Push("item 1") buff.Push("item 2") buff.Push("item 3") buff.Push("item 4") buff.Push("item 5") // block the current goroutine time.Sleep(3 * time.Second) println("done") } ### Interval-triggered flush package main import ( "time" "github.com/globocom/go-buffer/v3" ) func main() { buff := buffer.New( // call this function when the buffer needs flushing func(items []string) { for _, item := range items { println(item) } }, // buffer can hold up to 5 items buffer.WithSize(5), // buffer will be flushed every second, regardless of // how many items were pushed buffer.WithFlushInterval(time.Second), ) defer buff.Close() buff.Push("item 1") buff.Push("item 2") buff.Push("item 3") // block the current goroutine time.Sleep(3 * time.Second) println("done") } ### Manual flush package main import ( "time" "github.com/globocom/go-buffer/v3" ) func main() { buff := buffer.New( // call this function when the buffer needs flushing func(items []string) { for _, item := range items { println(item) } }, // buffer can hold up to 5 items buffer.WithSize(5), ) defer buff.Close() buff.Push("item 1") buff.Push("item 2") buff.Push("item 3") // block the current goroutine time.Sleep(3*time.Second) buff.Flush() println("done") } ## Examples v2 ### Size-triggered flush package main import ( "time" "github.com/globocom/go-buffer/v2" ) func main() { buff := buffer.New( // buffer can hold up to 5 items buffer.WithSize(5), // call this function when the buffer needs flushing buffer.WithFlusher(buffer.FlusherFunc(func(items []interface{}) { for _, item := range items { println(item.(string)) } })), ) // ensure the buffer defer buff.Close() buff.Push("item 1") buff.Push("item 2") buff.Push("item 3") buff.Push("item 4") buff.Push("item 5") // block the current goroutine time.Sleep(3 * time.Second) println("done") } ### Interval-triggered flush package main import ( "time" "github.com/globocom/go-buffer/v2" ) func main() { buff := buffer.New( // buffer can hold up to 5 items buffer.WithSize(5), // buffer will be flushed every second, regardless of // how many items were pushed buffer.WithFlushInterval(time.Second), // call this function when the buffer needs flushing buffer.WithFlusher(buffer.FlusherFunc(func(items []interface{}) { for _, item := range items { println(item.(string)) } })), ) defer buff.Close() buff.Push("item 1") buff.Push("item 2") buff.Push("item 3") // block the current goroutine time.Sleep(3 * time.Second) println("done") } ### Manual flush package main import ( "time" "github.com/globocom/go-buffer/v2" ) func main() { buff := buffer.New( // buffer can hold up to 5 items buffer.WithSize(5), // call this function when the buffer needs flushing buffer.WithFlusher(buffer.FlusherFunc(func(items []interface{}) { for _, item := range items { println(item.(string)) } })), ) defer buff.Close() buff.Push("item 1") buff.Push("item 2") buff.Push("item 3") // block the current goroutine time.Sleep(3*time.Second) buff.Flush() println("done") } ## Documentation Visit [Pkg.go.dev](https://pkg.go.dev/github.com/globocom/go-buffer) for full documentation. ## License [MIT License](https://github.com/globocom/go-buffer/blob/master/LICENSE)
标签:EVTX分析