| | |
| | |
| | |
| |
|
| | package sync_test |
| |
|
| | import ( |
| | "fmt" |
| | "os" |
| | "sync" |
| | ) |
| |
|
| | type httpPkg struct{} |
| |
|
| | func (httpPkg) Get(url string) {} |
| |
|
| | var http httpPkg |
| |
|
| | |
| | |
| | func ExampleWaitGroup() { |
| | var wg sync.WaitGroup |
| | var urls = []string{ |
| | "http://www.golang.org/", |
| | "http://www.google.com/", |
| | "http://www.example.com/", |
| | } |
| | for _, url := range urls { |
| | |
| | wg.Go(func() { |
| | |
| | http.Get(url) |
| | }) |
| | } |
| | |
| | wg.Wait() |
| | } |
| |
|
| | |
| | |
| | func ExampleWaitGroup_addAndDone() { |
| | var wg sync.WaitGroup |
| | var urls = []string{ |
| | "http://www.golang.org/", |
| | "http://www.google.com/", |
| | "http://www.example.com/", |
| | } |
| | for _, url := range urls { |
| | |
| | wg.Add(1) |
| | |
| | go func(url string) { |
| | |
| | defer wg.Done() |
| | |
| | http.Get(url) |
| | }(url) |
| | } |
| | |
| | wg.Wait() |
| | } |
| |
|
| | func ExampleOnce() { |
| | var once sync.Once |
| | onceBody := func() { |
| | fmt.Println("Only once") |
| | } |
| | done := make(chan bool) |
| | for i := 0; i < 10; i++ { |
| | go func() { |
| | once.Do(onceBody) |
| | done <- true |
| | }() |
| | } |
| | for i := 0; i < 10; i++ { |
| | <-done |
| | } |
| | |
| | |
| | } |
| |
|
| | |
| | |
| | func ExampleOnceValue() { |
| | once := sync.OnceValue(func() int { |
| | sum := 0 |
| | for i := 0; i < 1000; i++ { |
| | sum += i |
| | } |
| | fmt.Println("Computed once:", sum) |
| | return sum |
| | }) |
| | done := make(chan bool) |
| | for i := 0; i < 10; i++ { |
| | go func() { |
| | const want = 499500 |
| | got := once() |
| | if got != want { |
| | fmt.Println("want", want, "got", got) |
| | } |
| | done <- true |
| | }() |
| | } |
| | for i := 0; i < 10; i++ { |
| | <-done |
| | } |
| | |
| | |
| | } |
| |
|
| | |
| | func ExampleOnceValues() { |
| | once := sync.OnceValues(func() ([]byte, error) { |
| | fmt.Println("Reading file once") |
| | return os.ReadFile("example_test.go") |
| | }) |
| | done := make(chan bool) |
| | for i := 0; i < 10; i++ { |
| | go func() { |
| | data, err := once() |
| | if err != nil { |
| | fmt.Println("error:", err) |
| | } |
| | _ = data |
| | done <- true |
| | }() |
| | } |
| | for i := 0; i < 10; i++ { |
| | <-done |
| | } |
| | |
| | |
| | } |
| |
|