发布时间:2024-11-21 23:10:29
例如:
```go var sharedVariable int // 定义一个共享的变量 func main() { go increment() // 启动一个协程对变量进行自增操作 go printValue() // 启动一个协程打印变量的值 time.Sleep(time.Second) // 等待协程执行完毕 } func increment() { sharedVariable += 1 } func printValue() { fmt.Println(sharedVariable) } ```在这个例子中,我们定义了一个共享的变量`sharedVariable`,然后启动了两个协程来对变量进行操作。`increment`函数实现了对变量的自增操作,而`printValue`函数用于打印变量的值。由于这两个协程是并发执行的,需要确保它们不会同时访问`sharedVariable`,所以我们使用了互斥锁来进行同步。
例如:
```go func main() { ch := make(chan int) // 创建一个整型通道 go increment(ch) // 启动一个协程对变量进行自增操作 go printValue(ch) // 启动一个协程打印变量的值 time.Sleep(time.Second) // 等待协程执行完毕 } func increment(ch chan int) { ch <- 1 // 向通道发送数据 } func printValue(ch chan int) { fmt.Println(<-ch) // 从通道接收数据并打印 } ```在这个例子中,我们创建了一个整型通道`ch`,然后启动了两个协程。`increment`函数将整数1发送到通道中,而`printValue`函数从通道中接收该整数并打印。通道的发送和接收操作是阻塞的,它们会等待对应的操作完成后再继续执行。这样可以确保协程之间的顺序执行。
例如:
```go func main() { ch1 := make(chan int) ch2 := make(chan string) go sendData(ch1) // 启动一个协程向通道1发送数据 go sendString(ch2) // 启动一个协程向通道2发送数据 for { select { // 选择语句 case data := <-ch1: // 从通道1接收数据 fmt.Println(data) case str := <-ch2: // 从通道2接收数据 fmt.Println(str) } } } func sendData(ch chan int) { for i := 0; i < 5; i++ { ch <- i // 向通道发送数据 time.Sleep(time.Second) // 模拟耗时操作 } } func sendString(ch chan string) { strs := []string{"Hello", "World", "Golang"} for _, str := range strs { ch <- str // 向通道发送数据 time.Sleep(time.Second) // 模拟耗时操作 } } ```在这个例子中,我们创建了两个通道`ch1`和`ch2`,然后启动了两个协程分别向这两个通道发送数据。在主函数中,通过选择语句不断地从这两个通道中接收数据,并进行相应的处理。选择语句会等待任一通道有数据可读时立即执行对应的操作,因此实现了并发处理多个通道的效果。