发布时间:2024-11-05 21:47:05
```go func main() { go printHello() // 启动一个goroutine } func printHello() { fmt.Println("Hello, World!") } ```
上面的代码会同时执行main函数和printHello函数,而不是按顺序执行。使用goroutine可以很方便地实现并发。```go func main() { ch := make(chan string) go sendMessage(ch) // 启动一个goroutine发送消息 msg := <-ch // 从channel中接收消息 fmt.Println("Received message:", msg) } func sendMessage(ch chan<- string) { ch <- "Hello, World!" // 发送消息到channel中 } ```
上面的代码中,我们创建了一个channel来传递字符串类型的消息。在sendMessage函数中,我们向channel中发送了一条消息。在main函数中,我们通过"<-"操作符从channel中接收消息。使用channel可以很方便地实现goroutine之间的数据传输。```go var counter = 0 var mutex sync.Mutex func main() { wg := sync.WaitGroup{} for i := 0; i < 10; i++ { wg.Add(1) go increment(&wg) } wg.Wait() fmt.Println("Counter value:", counter) } func increment(wg *sync.WaitGroup) { mutex.Lock() defer mutex.Unlock() counter++ wg.Done() } ```
上面的代码中,我们创建了一个互斥锁mutex来保护counter这个共享资源的访问。在increment函数中,我们先锁定互斥锁,然后对counter进行递增操作,最后解锁互斥锁。通过互斥锁的使用,可以避免多个goroutine同时对共享资源的访问造成的问题。```go var condition = sync.NewCond(&sync.Mutex{}) var message string func main() { wg := sync.WaitGroup{} go produce() go consume() wg.Add(1) wg.Wait() } func produce() { condition.L.Lock() message = "Hello, World!" condition.Signal() condition.L.Unlock() } func consume() { condition.L.Lock() for message == "" { condition.Wait() } fmt.Println("Received message:", message) condition.L.Unlock() } ```
上面的代码中,我们使用条件变量和互斥锁来实现了一个简单的生产者-消费者模型。在produce函数中,我们设置了消息并通过Signal方法通知消费者。在consume函数中,如果消息为空,则等待并通过Wait方法进入等待状态。通过条件变量的使用,我们可以更加灵活地控制并发操作。 总之,Golang提供了强大而灵活的并发编程支持,通过使用goroutine、channel、互斥锁和其他并发原语,我们可以轻松地实现高效可靠的并发应用。掌握这些并发开发的技巧,对于成为一名优秀的Golang开发者来说,是非常重要的。希望本文的介绍能够对读者在Golang并发编程方面有所帮助。