下面代码修改自golang示例源码
package main import ( "fmt" "sync" "net/http" "io/ioutil" "log" ) func GetDemo(addr string) { res, err := http.Get(addr) if err != nil { log.Fatal(err) } robots, err := ioutil.ReadAll(res.Body) res.Body.Close() if err != nil { log.Fatal(err) } fmt.Printf("%s", robots) } // This example fetches several URLs concurrently, // using a WaitGroup to block until all the fetches are complete. func ExampleWaitGroup() { var wg sync.WaitGroup var urls = []string{ "http://www.golang.org/", "http://www.google.com/", "http://www.baidu.com/", } for _, url := range urls { // Increment the WaitGroup counter. wg.Add(1) // Launch a goroutine to fetch the URL. go func(url string) { // Decrement the counter when the goroutine completes. defer wg.Done() // Fetch the URL. GetDemo(url) }(url) } // Wait for all HTTP fetches to complete. wg.Wait() fmt.Println("--------------------group wait over ---------------------------") } 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 } fmt.Println("once over -------------------------------") // Output: // Only once } func main() { ExampleOnce() ExampleWaitGroup() }
有疑问加站长微信联系(非本文作者)