"学习Go语言基础的goroutine和channel并发编程"
版权申诉
168 浏览量
更新于2024-03-06
收藏 60KB DOCX 举报
"Go语言中的goroutine和channel是并发编程的重要概念。在Go语言中,每一个并发的执行单元叫做一个goroutine。并发指的是逻辑上具备同时处理多个任务的能力,而并行则是物理上在同一时刻执行多个并发任务。当一个程序启动时,其主函数即在一个单独的goroutine中运行,一般这个goroutine是主goroutine。如果想要创建新的goroutine,只需要在执行普通函数或者方法的前面加上关键字go。
通过下面一个例子演示并发的效果:主goroutine会计算第45个斐波那契函数,在计算的同时会循环打印:-|/。需要注意的是,当主goroutine结束之后,所有的goroutine都会被打断,程序就会退出。
```go
package main
import (
"time"
"fmt"
)
func spinner(delay time.Duration) {
for {
for _, r := range `-|/` {
fmt.Printf("\r%c", r)
time.Sleep(delay)
}
}
}
func fib(x int) int {
if x < 2 {
return x
}
return fib(x-1) + fib(x-2)
}
func main() {
go spinner(100 * time.Millisecond)
const n = 45
fibN := fib(n)
fmt.Printf("\rFibonacci(%d) = %d\n", n, fibN)
}
```
在上面的例子中,我们使用了go关键字来创建了一个新的goroutine,用来执行spinner函数。同时,主函数计算第45个斐波那契数并打印结果。这样,我们实现了并发执行两个不同的任务,spinner函数和fib函数。这种基于goroutine的并发模型使得我们可以更高效地利用系统的多核心和多线程资源,并且更好地实现了并发编程的复杂性。
那么,如果我们想要这两个goroutine之间进行通信,该怎么办呢?这就需要使用channel了。Channel是Go语言中用来在goroutine之间进行通信的一种机制。通道可以是带缓冲的,也可以是不带缓冲的。
带缓冲的通道允许发送者在没有接收者接收时发送消息到通道中,而不会阻塞。不带缓冲的通道则必须要有接收者同时准备好接收,否则发送操作就会被阻塞。
下面是一个使用channel实现的简单例子:
```go
package main
import "fmt"
func main() {
ch := make(chan int)
go func() {
ch <- 42
}()
fmt.Println(<-ch)
}
```
在这个例子中,我们创建了一个整型的通道ch,并在一个新的goroutine中向其发送了一个整数。在主goroutine中,我们从通道中接收到了这个整数并打印出来。通过channel,两个goroutine之间实现了数据的传输和通信。
综上所述,goroutine和channel是Go语言并发编程的重要组成部分。通过goroutine,我们可以高效地利用系统资源,并实现并发执行任务;而通过channel,我们可以在不同的goroutine之间进行高效的通信和数据交换。这些特性使得Go语言成为一种优秀的并发编程语言,适合于构建高效的并发和并行应用程序。"
2020-12-20 上传
2021-07-14 上传
2019-08-13 上传
2019-08-14 上传
2021-06-12 上传
2021-06-12 上传
2019-08-14 上传
2021-07-14 上传
码农.one
- 粉丝: 7
- 资源: 345
最新资源
- 基于Python和Opencv的车牌识别系统实现
- 我的代码小部件库:统计、MySQL操作与树结构功能
- React初学者入门指南:快速构建并部署你的第一个应用
- Oddish:夜潜CSGO皮肤,智能爬虫技术解析
- 利用REST HaProxy实现haproxy.cfg配置的HTTP接口化
- LeetCode用例构造实践:CMake和GoogleTest的应用
- 快速搭建vulhub靶场:简化docker-compose与vulhub-master下载
- 天秤座术语表:glossariolibras项目安装与使用指南
- 从Vercel到Firebase的全栈Amazon克隆项目指南
- ANU PK大楼Studio 1的3D声效和Ambisonic技术体验
- C#实现的鼠标事件功能演示
- 掌握DP-10:LeetCode超级掉蛋与爆破气球
- C与SDL开发的游戏如何编译至WebAssembly平台
- CastorDOC开源应用程序:文档管理功能与Alfresco集成
- LeetCode用例构造与计算机科学基础:数据结构与设计模式
- 通过travis-nightly-builder实现自动化API与Rake任务构建