发布时间:2024-11-22 00:13:25
与Goroutine配合使用的是"Channels",它是一种用于在多个Goroutine之间进行通信和同步的机制。通过Channels,Goroutine可以安全地发送和接收数据,从而实现不同Goroutine之间的协作。
func main() { go sayHello() time.Sleep(time.Second) } func sayHello() { fmt.Println("Hello, Golang!") }在上述代码中,我们使用了一个Goroutine来执行sayHello函数。主函数中的"go sayHello()"语句表示将sayHello函数包装成一个Goroutine并并发执行。由于Goroutine是并发执行的,所以我们需要使用time.Sleep函数来确保主函数在Goroutine完成之前不会退出。
func main() { ch := make(chan int) go produce(ch) go consume(ch) time.Sleep(time.Second) } func produce(ch chan<- int) { for i := 0; i < 10; i++ { ch <- i } close(ch) } func consume(ch <-chan int) { for num := range ch { fmt.Println("Received:", num) } }在上述代码中,我们创建了一个int类型的Channel,然后使用两个Goroutine分别作为生产者和消费者。生产者Goroutine通过"<-"操作符将数据发送到Channel中,而消费者Goroutine通过"<-"操作符从Channel中接收数据。当Channel被关闭时,消费者Goroutine就会停止接收数据。
var count int var mutex sync.Mutex func main() { var wg sync.WaitGroup for i := 0; i < 1000; i++ { wg.Add(1) go increment(&wg) } wg.Wait() fmt.Println("Count:", count) } func increment(wg *sync.WaitGroup) { mutex.Lock() count++ mutex.Unlock() wg.Done() }在上述代码中,我们使用Mutex来保护count变量的访问。每个Goroutine在访问count之前都必须先获取互斥锁,然后在访问完成后释放锁。通过这种方式,我们可以确保多个Goroutine对count的访问是安全的。
func main() { ch := make(chan bool) go longRunningTask(ch) select { case <-ch: fmt.Println("Task completed.") case <-time.After(time.Second): fmt.Println("Task timeout.") } } func longRunningTask(ch chan<- bool) { time.Sleep(2 * time.Second) ch <- true }在上述代码中,我们使用select语句同时监听ch和time.After两个Channel。如果ch在指定时间内收到了数据,select语句会执行对应的分支;否则,timeout分支就会被执行,表示任务超时。
参考资料: