一、使用方式
1.1、最简单的最常用的方式:使用go关键词
func main() {
go func() {
fmt.Println("hello world1")
}()
go func() {
fmt.Println("hello world2")
}()
}
或者:
func main() {
go Announce("hello world1")
go Announce("hello world2")
}
func Announce(message string) {
fmt.Println(message)
}
使用匿名函数传递参数
data := "Hello, World!"
go func(msg string) {
// 使用msg进行异步任务逻辑处理
fmt.Println(msg)
}(data)
这种方式不需要考虑返回值问题,如果要考虑返回值,可以使用下面的方式。
1.2、通过goroutine和channel来实现
ch := make(chan int, 1) // 创建一个带缓冲的channel
// ch := make(chan int, 0) // 创建一个无缓冲的channel
go func() {
// 异步任务逻辑
ch <- result // 将结果发送到channel
// 异步任务逻辑
close(ch) // 关闭channel,表示任务完成
}()
// 在需要的时候从channel接收结果
result := <-ch
1.3、使用sync.WaitGroup
sync.WaitGroup用于等待一组协程完成其任务。通过Add()方法增加等待的协程数量,Done()方法标记协程完成,Wait()方法阻塞直到所有协程完成。
var wg sync.WaitGroup
// 启动多个协程
for i := 0; i < 5; i++ {
wg.Add(1)
go func(index int) {
defer wg.Done()
// 异步任务逻辑
}(i)
}
// 等待所有协程完成
wg.Wait()
1.4、使用errgroup实现协程组的错误处理
如果想简单获取协程返回的错误,errgroup包很适合,errgroup包是Go语言标准库中的一个实用工具,用于管理一组协程并处理它们的错误。可以使用errgroup.Group结构来跟踪和处理协程组的错误。
var eg errgroup.Group
for i := 0; i < 5; i++ {
eg.Go(func() error {
return errors.New("error")
})
eg.Go(func() error {
return ni