Golang学习笔记_26——通道
Golang学习笔记_23——error补充
Golang学习笔记_24——泛型
Golang学习笔记_25——协程Golang学习笔记_25——协程
通道
在Go中,协程是通过go关键字来创建的。当你使用go关键字调用一个函数时,该函数会在一个新的协程中执行。
协程的调度由Go运行时(runtime)管理,开发者不需要关心具体的调度细节。
虽然协程可以并发执行,但有时候我们需要在协程之间传递数据或进行同步。在Go中,这是通过通道(Channel)来实现的。
通道是一种类型安全的、多路复用的、在协程之间传递通信的管道。
通道的类型由通道中传递的元素类型决定。例如,chan int是一个可以传递int类型数据的通道。
1. 创建通道
使用make
函数创建通道
ch := make(chan int)
2. 发送和接收数据
使用箭头操作符(<-
)向通道发送或接收数据
ch <- 42 // 发送数据到通道
value := <- ch // 从通道中接受数据
3. 带缓冲的通道
// 创建一个缓冲区大小为2的缓冲通道
ch := make(chan int, 1)
4. Demo
import "fmt"
func sum(a []int, c chan int) {
total := 0
for _, v := range a {
total += v
}
c <- total // 将计算结果发送到通道
}
func channelDemo() {
a := []int{7, 2, 8, -9, 4, 0}
c := make(chan int)
go sum(a[:len(a)/2], c)
go sum(a[len(a)/2:], c)
result1 := <-c
result2 := <-c
fmt.Println(result1 + result2)
}
测试方法
func Test_channelDemo(t *testing.T) {
channelDemo()
}
输出结果
=== RUN Test_channelDemo
12
--- PASS: Test_channelDemo (0.00s)
PASS
源码
// channel_demo.go 文件
package channel_demo
import "fmt"
func sum(a []int, c chan int) {
total := 0
for _, v := range a {
total += v
}
c <- total // 将计算结果发送到通道
}
func channelDemo() {
a := []int{7, 2, 8, -9, 4, 0}
c := make(chan int)
go sum(a[:len(a)/2], c)
go sum(a[len(a)/2:], c)
result1 := <-c
result2 := <-c
fmt.Println(result1 + result2)
}
// channel_demo_test.go 文件
package channel_demo
import "testing"
func Test_channelDemo(t *testing.T) {
channelDemo()
}
原文地址:https://blog.csdn.net/LuckyLay/article/details/145193048
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!