如何创建Golang协程 go关键字使用基础

Go语言中,协程(goroutine)通过go关键字实现轻量级并发,启动函数独立执行,需注意主协程等待、共享变量同步及循环变量捕获问题,常用sync.WaitGroup协调多个协程完成任务。

如何创建golang协程 go关键字使用基础

在Go语言中,协程(goroutine)是实现并发编程的核心机制。它比操作系统线程更轻量,启动和销毁的开销小,适合处理大量并发任务。使用 go 关键字可以轻松创建一个协程,让函数在独立的执行流中运行。

go关键字的基本用法

只需在函数调用前加上 go,即可启动一个协程:

go functionName()

例如:

package main

import (“fmt””time”)

func sayHello() {fmt.Println(“Hello from goroutine”)}

func main() {go sayHello() // 启动协程time.Sleep(100 * time.Millisecond) // 等待协程执行fmt.Println(“Main function”)}

输出可能是:

立即学习“go语言免费学习笔记(深入)”;

Hello from goroutineMain function

注意:如果没有 time.Sleep,主程序可能在协程执行前就退出了,导致看不到输出。

协程与匿名函数

你也可以通过匿名函数的方式启动协程,适用于需要传参或临时逻辑的场景:

go func(msg string) { fmt.Println(msg)}(“Hello inline goroutine”)

这种方式常用于一次性任务,避免定义额外函数。

协程间的协作与同步

多个协程并发执行时,主函数无法自动等待它们完成。常见做法是使用 sync.WaitGroup

package main

import (“fmt””sync””time”)

func worker(id int, wg *sync.WaitGroup) {defer wg.Done() // 任务完成,通知WaitGroupfmt.Printf(“Worker %d startingn”, id)time.Sleep(time.Second)fmt.Printf(“Worker %d donen”, id)}

func main() {var wg sync.WaitGroup

for i := 1; i <= 3; i++ {    wg.Add(1)    go worker(i, &wg)}wg.Wait() // 等待所有协程完成fmt.Println("All workers done")

}

输出:

Worker 1 startingWorker 2 startingWorker 3 startingWorker 1 doneWorker 2 doneWorker 3 doneAll workers done

注意事项

使用协程时需注意以下几点:

主协程退出后,其他协程也会被强制终止协程之间共享变量时,要注意数据竞争,必要时使用互斥锁(sync.Mutex)不要依赖协程的执行顺序,它们是并发调度的避免在循环中直接使用循环变量,应传参避免闭包问题

基本上就这些。go关键字让并发变得简单,但合理管理协程生命周期和共享资源才是写出稳定程序的关键。

以上就是如何创建Golang协程 go关键字使用基础的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1399844.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月15日 16:31:50
下一篇 2025年12月15日 16:32:05

相关推荐

  • Golang的错误处理如何与defer配合 资源清理时的错误传播问题

    在 go 语言中,defer 中的错误默认会被忽略,必须通过命名返回值结合闭包的方式显式捕获并处理,例如在关闭文件时应将 close 错误赋值给命名返回参数,且仅在主逻辑无错误时覆盖,以优先传播业务错误;当涉及多个资源清理时,需为每个资源设置独立的 defer 并分别收集错误,可使用 errors.…

    2025年12月15日
    000
  • Golang指针在反射中处理 reflect.Value转换技巧

    掌握Go反射中指针操作的关键在于正确使用Kind、Elem和Set方法。首先通过v.Kind() == reflect.Ptr判断是否为指针类型,若是指针则调用v.Elem()获取指向的值;修改值时必须传入指针,否则引发panic;初始化nil指针字段可使用reflect.New创建对应类型的指针值…

    2025年12月15日
    000
  • 如何选择Golang结构体的指针或值字段 考虑零值与内存布局因素

    选择golang结构体字段使用指针还是值,需根据零值状态、内存占用和修改意图权衡。1. 若需区分零值与已赋值状态,用指针更合适;2. 大型结构体优先选指针以减少内存复制;3. 需在函数内修改原始结构体时必须用指针;4. 并发访问下指针需同步机制保护;5. 小结构体或无需修改时优选值类型;6. 逃逸分…

    2025年12月15日 好文分享
    000
  • Golang流量限制器 rate包使用指南

    Golang的rate包基于令牌桶算法实现限流,通过rate.NewLimiter(r, b)设置每秒令牌数r和桶容量b,控制请求速率与突发流量。 Golang中的 rate 包提供了一种非常优雅且高效的方式来实现基于令牌桶算法的流量限制。说白了,它就是帮你控制操作频率,避免系统在短时间内被突发请求…

    2025年12月15日
    000
  • Golang的container数据结构 heap/list应用

    Go的container/list实现双向链表,支持高效插入删除,适用于LRU缓存等场景;2. container/heap需自定义类型实现接口,通过Len、Less、Swap、Push、Pop方法构建堆,常用于优先队列。 Go语言标准库中的 container 包提供了几种常用的数据结构,其中 h…

    2025年12月15日
    000
  • Golang的errors库如何创建自定义错误 演示错误包装与解包的最佳实践

    在 golang 中,错误处理应优先使用结构体实现 error 接口以携带额外信息,1. 自定义错误类型通过实现 error() 方法支持类型判断与信息扩展;2. 简单错误可用 errors.new 或 fmt.errorf,但不便于类型提取;3. 使用 fmt.errorf 的 %w 动词包装错误…

    2025年12月15日 好文分享
    000
  • Golang分布式事务处理 Saga模式案例

    Saga模式通过拆分长事务为本地事务并定义补偿操作来保证最终一致性,适用于订单支付发货等跨服务流程。 在Golang构建的分布式系统中,Saga模式是一种处理跨多个微服务长事务的有效方式。它通过将一个大事务拆分为一系列本地事务,并为每个步骤定义补偿操作,来保证最终一致性。下面是一个基于Saga模式的…

    2025年12月15日
    000
  • Golang开发环境如何支持M1芯片 优化ARM64原生编译性能

    Golang对M1芯片支持已成熟,需安装Go 1.16+版本(推荐1.20+),配置GOROOT和PATH环境变量,使用Go Modules管理依赖,并通过go build优化参数提升性能。 简单来说,Golang对M1芯片的支持已经相当成熟,重点在于配置合适的Go版本以及利用Go Modules进…

    2025年12月15日
    000
  • Golang实现CI/CD流水线 GitHub Actions集成

    用Golang构建CI/CD流水线并集成GitHub Actions,核心是自动化测试、构建、代码质量检查和部署。流程从代码提交触发,经测试、构建、检查后可选部署,提升交付效率与代码稳定性。 用Golang构建CI/CD流水线并集成GitHub Actions,核心是自动化测试、构建、代码质量检查和…

    2025年12月15日
    000
  • Golang错误处理最佳实践 区分error与panic场景

    Go语言中通过error和panic/recover处理异常,error用于可预期错误,如文件不存在;panic用于不可恢复的严重错误。函数应优先返回error值,调用者通过判断error是否为nil处理错误。使用fmt.Errorf搭配%w可实现错误链包装,便于用errors.Is和errors.…

    2025年12月15日
    000
  • Docker中如何构建Golang开发环境 容器化开发方案

    答案是使用Docker构建Golang开发环境可通过Dockerfile和docker-compose实现隔离、一致且高效的开发流程。首先创建基于golang镜像的Dockerfile,设置工作目录、下载依赖并拷贝代码,利用多阶段构建优化镜像体积,编译阶段使用完整Go环境,运行阶段切换至alpine…

    2025年12月15日
    000
  • Golang如何清理无用依赖 go mod tidy用法

    go mod tidy会清理未使用的依赖并补全缺失的依赖,通过扫描代码中的import语句构建实际依赖图谱,与go.mod比对后移除无用模块、添加新引入的模块,同时更新go.sum文件确保依赖完整性和安全性;使用时需注意反射等动态引用可能被误删、间接依赖版本变化风险,以及vendor目录需手动同步等…

    2025年12月15日
    000
  • Golang超时控制 context超时取消

    Go语言中Context通过传递取消信号和超时控制实现并发安全,核心是context.WithTimeout和context.WithDeadline创建带取消机制的上下文,下游函数通过监听ctx.Done()通道及时终止任务;需注意defer cancel()释放资源、避免传递nil Contex…

    2025年12月15日
    000
  • Golang的context上下文 超时与取消控制

    Context是Go中管理协程生命周期的核心接口,通过Deadline、Done、Err和Value方法传递取消信号、超时及请求范围的值;使用context.Background或context.TODO作为根,可派生带取消功能的子context,调用cancel函数通知所有相关goroutine。…

    2025年12月15日
    000
  • Golang如何添加模块许可证 开源规范

    答案:为Go模块添加开源许可证需选择合适许可证并将其完整文本保存为根目录的LICENSE文件,同时在每个.go文件顶部添加版权和许可证声明。这明确使用规则,消除法律不确定性,促进代码被合法使用与传播,避免常见误区如认为上传GitHub即开源,最佳实践包括使用SPDX标识符、确保许可证兼容性并利用工具…

    2025年12月15日
    000
  • Golang全链路优化指南 从编码到部署

    全链路优化需从编码、运行时、分析工具到部署运维系统性推进。首先,编码阶段应预分配slice和map容量,避免频繁扩容;用strings.Builder替代+拼接字符串以减少内存分配;谨慎使用接口以防不必要的内存逃逸和值复制;通过context控制goroutine生命周期防止泄露;利用sync.Po…

    2025年12月15日
    000
  • Golang panic和recover机制 何时使用异常处理

    应优先使用 error 处理可预期错误,panic 仅用于不可恢复的严重错误,recover 可在 defer 中捕获 panic 防止程序崩溃,但不修复错误,常用于服务器入口或 goroutine 防护。 在 Go 语言中,panic 和 recover 是内置机制,用于处理程序运行时的严重错误。…

    2025年12月15日
    000
  • 怎样用Golang管理微服务配置 基于Viper的配置中心方案

    使用Viper实现Go微服务配置管理,支持多格式、多环境及远程配置中心。通过本地文件(如config.yaml)加载基础配置,结合环境变量区分dev、test、prod环境,利用etcd或Consul实现配置热更新与集中管理,并可将配置绑定结构体进行校验,提升可维护性与安全性。 微服务架构下,配置管…

    2025年12月15日
    000
  • Golang模块管理最佳实践 大型项目经验

    答案:Golang模块管理需遵循依赖控制、版本管理和构建效率三大原则,采用go mod作为官方推荐工具,通过语义版本与MVS算法避免冲突,利用replace指令、vendor目录及依赖分析工具解决依赖问题;通过模块缓存、并行构建、GOPROXY代理和减少冗余依赖提升构建速度;私有模块通过GOPRIV…

    2025年12月15日
    000
  • Golangmap访问优化 预分配容量与分片

    预分配容量和并发分片是优化Go map性能的核心手段。预分配通过make(map[KeyType]ValueType, cap)减少扩容开销,避免频繁的内存分配与元素迁移,降低CPU和GC压力;并发分片则将map拆分为多个带独立锁的小map,利用哈希值定位分片,显著减少锁竞争,提升高并发读写吞吐量。…

    2025年12月15日
    000

发表回复

登录后才能评论
关注微信