package
0.0.0-20210310035445-5a72c2010943
Repository: https://github.com/vgmdj/utils.git
Documentation: pkg.go.dev

# README

使用示例

package main

import (
	"context"
	"fmt"
	"log"
	"time"

	"github.com/vgmdj/utils/sync/errgroup"
)

func main() {
	defer log.Println("main exiting")

	g := errgroup.WithCancel(context.Background())
	g.Go(One)
	g.Go(Two)
	g.Go(Three)

	err := g.Wait()
	if err != nil {
		log.Println(err.Error())
		return
	}

	log.Println("successfully finish all workers")

}

func One(ctx context.Context) error {
	// do something with ctx
	defer log.Println("one exiting")

	after := time.After(2 * time.Second)
	select {
	case <-ctx.Done():
		log.Println("one Ctx done")
		return fmt.Errorf("one ctx done")
	case <-after:
		log.Println("success one after 2 seconds")
		return nil
	}
}

func Two(ctx context.Context) error {
	defer log.Println("two exiting")
	// do something with ctx

	after := time.After(5 * time.Second)
	select {
	case <-ctx.Done():
		log.Println("two Ctx done")
		return fmt.Errorf("two ctx done")
	case <-after:
		log.Println("two after 5 seconds")
		//return fmt.Errorf("err two after 5 seconds")
		panic("err two after 5 seconds")
	}

}

func Three(ctx context.Context) error {
	defer log.Println("three exiting")
	// do something with ctx

	after := time.After(10 * time.Second)
	select {
	case <-ctx.Done():
		log.Println("three Ctx done")
		return fmt.Errorf("three ctx done")
	case <-after:
		log.Println("three after 10 seconds")
		return fmt.Errorf("err three after 10 seconds")
	}
}




# Functions

WithCancel create a new Group and an associated Context derived from ctx.
WithContext create a Group.

# Structs

A Group is a collection of goroutines working on subtasks that are part of the same overall task.