Skip to content

go-god/wrap

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

8 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

wrap

  • wrap go sync.WaitGroup processing goroutine
  • wrap go chan processing goroutine

why wrap

  • Wrap the go sync.WaitGroup so that you don't sometimes forget to write defer wg.Add(1) before the business layer writes go func, or defer wg.Done() when it's Done.
  • By wrapping it, you can ensure that the Go Goroutine executes successfully.

example

package main

import (
	"log"

	"github.com/go-god/wrap"
)

func main() {
	// through wg to exec goroutine
	var wg = wrap.New()
	wg.Wrap(func() {
		log.Println("this is test")
	})

	for i := 0; i < 10; i++ {
		num := i
		// wrap go goroutine without recovery func
		wg.Wrap(func() {
			log.Println("current index:", num)
		})
	}

	wg.WrapWithRecovery(func() {
		log.Println("exec goroutine with recovery func")
		var s = []string{"a", "b", "c"}
		log.Printf("s[3] = %v", s[3])
	}, func(r interface{}) {
		// exec recover:runtime error: index out of range [3] with length 3
		log.Printf("exec recover:%v", r)
	})

	wg.Wait()

	// through chan to exec goroutine
	w := wrap.NewChanWrapper(2)
	w.Wrap(func() {
		log.Println("this is test")
	})

	w.WrapWithRecovery(func() {
		log.Println("exec goroutine with recovery func")
		var s = []string{"a", "b", "c"}
		log.Printf("s[3] = %v", s[3])
	}, func(r interface{}) {
		// exec recover:runtime error: index out of range [3] with length 3
		log.Printf("exec recover:%v", r)
	})

	w.Wait()
}