Golang 通道与并发

GolangGolangBeginner
立即练习

This tutorial is from open-source community. Access the source code

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

实验(Channels lab)旨在测试你对 Go 语言中通道(channels)的理解。通道用于连接并发的 goroutine,允许在它们之间发送和接收值。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL go(("Golang")) -.-> go/ConcurrencyGroup(["Concurrency"]) go/ConcurrencyGroup -.-> go/channels("Channels") subgraph Lab Skills go/channels -.-> lab-15459{{"Golang 通道与并发"}} end

通道

在这个实验中,你需要创建一个新的通道,并从一个新的 goroutine 向其中发送一个值。然后,你将从通道接收该值并打印出来。

  • 你必须使用 make(chan val-type) 语法来创建一个新的通道。
  • 通道必须由它所传递的值进行类型化。
  • 你必须使用 channel <- 语法向通道发送一个值。
  • 你必须使用 <-channel 语法从通道接收一个值。
  • 你必须使用一个新的 goroutine 向通道发送值。
## 当我们运行程序时,"ping" 消息通过我们的通道成功地从一个 goroutine 传递到另一个 goroutine。
$ go run channels.go
ping

## 默认情况下,发送和接收会阻塞,直到发送方和接收方都准备好。这个特性使我们能够在程序结束时等待 "ping" 消息,而无需使用任何其他同步机制。

下面是完整的代码:

// 通道是连接并发 goroutine 的管道。你可以从一个 goroutine 向通道发送值,并从另一个 goroutine 接收这些值。

package main

import "fmt"

func main() {

	// 使用 `make(chan val-type)` 创建一个新的通道。通道由它们所传递的值进行类型化。
	messages := make(chan string)

	// 使用 `channel <-` 语法向通道发送一个值。在这里,我们从一个新的 goroutine 向上面创建的 `messages` 通道发送 "ping"。
	go func() { messages <- "ping" }()

	// `<-channel` 语法从通道接收一个值。在这里,我们将接收上面发送的 "ping" 消息并打印出来。
	msg := <-messages
	fmt.Println(msg)
}

总结

实验(Channels lab)测试你使用 Go 语言中的通道在并发 goroutine 之间发送和接收值的能力。通过完成这个实验,你将更好地理解通道的工作原理以及如何使用它们来提高 Go 语言程序的性能。