发布时间:2024-12-23 00:14:35
例如,我们可以使用以下代码来开启一个简单的协程:
func main() {
go someFunction()
// 其他代码
}
在上面的代码中,`someFunction()`函数会被作为一个协程并发执行。当协程执行完毕后,程序会继续向下执行其他代码。
func main() {
N := 10
result := make([]int, N)
wg := sync.WaitGroup{}
wg.Add(N)
for i := 0; i < N; i++ {
go func(i int) {
result[i] = fibonacci(i)
wg.Done()
}(i)
}
wg.Wait()
fmt.Println(result)
}
func fibonacci(n int) int {
if n <= 1 {
return n
}
return fibonacci(n-1) + fibonacci(n-2)
}
在上面的代码中,我们定义了一个`result`切片来保存计算结果。使用`sync.WaitGroup`来等待所有协程执行完毕。每个协程计算完斐波那契数列的一个数后,使用`wg.Done()`来通知等待组。最终,我们打印出结果。
(2)并发地下载网页内容
在网络编程中,经常需要并发地下载多个网页的内容。我们可以使用协程来同时下载多个网页。
func main() {
urls := []string{
"http://www.example.com",
"http://www.example.org",
"http://www.example.net",
}
wg := sync.WaitGroup{}
wg.Add(len(urls))
for _, url := range urls {
go func(url string) {
defer wg.Done()
resp, err := http.Get(url)
if err != nil {
fmt.Println(err)
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("%s: %d bytes\n", url, len(body))
}(url)
}
wg.Wait()
}
在上面的代码中,我们定义了一个切片`urls`来保存要下载的网址。然后使用一个循环开启多个协程,每个协程负责下载一个网页。使用`sync.WaitGroup`等待所有协程执行完毕。