go 函数通过 channel 传递数据、wait group 或 channel 控制执行流、mutex 或 channel 同步任务来与 goroutine 交互:传递数据:使用 channel 作为 fifo 队列,从函数向协程发送和接收值。控制执行流:使用 wait group 等待协程完成执行,或使用 channel 通知协程执行特定操作。同步任务:使用 mutex 或 channel 对并发访问的资源进行同步,确保一次只有一个协程访问资源。
Go 函数如何与 Goroutine 交互?
在 Go 中,Goroutine 是并发执行的轻量级线程。它们允许您并行运行代码,提高应用程序性能。函数可以与协程交互以控制执行流、传递数据和同步任务。
传递数据
可以通过 channel 将数据从函数传递到协程。Channel 是一个 FIFO(先进先出)队列,允许协程从函数接收和发送值。以下示例展示了如何使用 channel:
package main
import "fmt"
func sendData(ch chan<- int) {
for i := 0; i < 10; i++ {
ch <- i
}
close(ch)
}
func receiveData(ch <-chan int) {
for {
data, ok := <-ch
if !ok {
return
}
fmt.Println("Received:", data)
}
}
func main() {
ch := make(chan int)
go sendData(ch)
receiveData(ch)
}
控制执行流
可以使用 wait group 或 channel 控制协程的执行流。Wait group 允许您等待所有协程完成执行,而 channel 可用于通知协程执行特定操作。以下示例展示了如何使用 wait group:
package main
import (
"fmt"
"sync"
)
var wg sync.WaitGroup
func task(i int) {
fmt.Println("Task", i)
wg.Done()
}
func main() {
for i := 0; i < 10; i++ {
wg.Add(1)
go task(i)
}
wg.Wait()
}
同步任务
可以通过 mutex 或 channel 对并发访问的资源进行同步。Mutex 互斥锁,一次允许一个协程访问资源。Channel 可用于阻塞协程,直到资源可用。以下示例展示了如何使用 mutex:
package main
import (
"fmt"
"sync"
)
var mutex sync.Mutex
func task(data string) {
mutex.Lock()
fmt.Println(data)
mutex.Unlock()
}
func main() {
for i := 0; i < 10; i++ {
go task(fmt.Sprintf("Task %d", i))
}
}