有没有Go选手啊,这个执行原理是什么啊?

答案好奇怪啊

func main() {
runtime.GOMAXPROCS(1)
wg := sync.WaitGroup{}
wg.Add(20)
for i := 0; i < 10; i++ {
go func() {
fmt.Println("i: ", i)
wg.Done()
}()
}
for i := 0; i < 10; i++ {
go func(i int) {
fmt.Println("i: ", i)
wg.Done()
}(i)
}
wg.Wait()
}
#牛客在线求职答疑中心#  #机械/制造每日一题#  #Go#  #golang#
📝笔试题目
👥面试题目
全部评论
这段代码是一个Go语言程序,主要涉及到了goroutine、channel和waitgroup等概念。 1. `runtime.GOMAXPROCS(1)`:设置Go程序可以并行执行的CPU核心数,这里设置为1,意味着程序只能使用一个CPU核心。 2. `wg := sync.WaitGroup{}`:创建一个新的等待组,用于等待所有goroutine执行完毕。 3. `wg.Add(20)`:设置等待组的计数器值为20,表示需要等待20个goroutine执行完毕。 4. 两个for循环分别创建了10个goroutine,每个goroutine都会执行`fmt.Println("i: ", i)`和`wg.Done()`。 5. `wg.Wait()`:等待等待组中的计数器值为0,即所有goroutine执行完毕。 这段代码的执行结果是:会输出20个"i: x",其中x的值从0到19。 至于答案为什么奇怪,可能是因为题目要求输出结果与实际输出结果不符,或者题目要求理解这段代码的执行原理,而答案并没有解释清楚。
2 回复 分享
发布于 2024-07-09 19:36 AI生成
循环变量是共享的,不过似乎go 1.22已经填补了这个坑
1 回复 分享
发布于 2024-07-09 20:33 北京
9012345678,9 协程是最后创建的,会直接运行 9 协程,然后在按队列顺序运行, 可以看下协程创建的源码
1 回复 分享
发布于 2024-07-21 09:37 北京
字节组内实习生招聘,同学感兴趣可以私聊
点赞 回复 分享
发布于 2024-07-18 14:41 广东
这是啥题
点赞 回复 分享
发布于 2024-08-01 17:47 北京
什么鬼 根本看不懂
点赞 回复 分享
发布于 2024-08-02 16:31 北京
是一道用来理解 gmp 调度机制的蛮好的题,可以配合曹大的 go 调度相关博文来理解,也可以像楼上说的直接扎进源码里看👀
点赞 回复 分享
发布于 2024-08-10 01:30 浙江
go大佬在这里【干了3年go,吹嘘下不过分吧】 给你解释下这段代码。 涉及到协程的一些知识。 第一段代码,由于循环变量未传入到协程,协程与for循环使用的是同一个循环变量 i, 协程是并发不阻塞的。也就是在执行协程的同时,for循环也在执行。所以打印的结果其实是不确定的,要先理解并发的概念,并发并发就是不分先后,不分先后的意思是不确定先后,但实际执行其实是有先后的,只是这个先后是不确定的。所以实际打印的结果跟各自的机器有关系,你换一台机器打印的结果可能就不一样了。 第二段代码,循环变量 i 传入到协程里,协程都会有一个协程栈空间,这个i传入到协程占栈空间里,也就创建了一个副本,copy了一份,所以每个协程里的值其实是确定的,也就是for循环的i传入的值。 基础知识点:协程,并发,协程栈空间。多说一句,这并不是什么bug哈。
点赞 回复 分享
发布于 2024-08-15 21:00 上海
答案奇怪是指什么,没实际跑过。两个循环并发,上面的goroutine打印循环变量i,这个地址是共享的,有读有写有竞态,因此上面的循环不保证打印出所有的0-10,下面的打印拷贝到函数内部的循环变量i,没有竞态问题,因此能输出0-10。20个goroutine没有同步,因此可能以任意顺序执行
点赞 回复 分享
发布于 2024-08-17 07:03 四川
这种直接gpt呀,
点赞 回复 分享
发布于 2024-08-23 10:22 广东

相关推荐

2024-12-19 15:10
已编辑
中国科学技术大学 golang
马上进入到找暑期实习的时候,大家要开始进行准备,从一场面试的经典流程来给大家分析需要在哪些方面做足准备。回答问题的关键:总分结构。先对问题做总结性回答,再逐条回答细节。1、自我介绍自我介绍是面试的开场白,目的是让面试官快速了解你的基本信息、学历背景以及与你申请岗位相关的实习和项目经历。要做到简洁明了,突出重点。面试官您好,我叫xxx,现就读于xx学校,(研究生)x年级,本科来自于xxx。在在xx公司从事过后端开发的,主要负责了xxx的开发。此外,自己还独立完成了一个xx项目,使用xx技术实现了一个xx系统。这就是我的一些基本情况。2、实习经历和项目经历(各类场景问题处理)2.1 实习和项目经历让你自己介绍:先介绍整体系统的功能,提供了一个什么样的平台/用来做什么,再介绍自己的工作部分。主要考验你做了什么(工作量),掌握了哪些技术,解决了什么难点,为什么要这样设计,为什么要使用这个中间件而不是另一个,想好自己的架构设计。在面试前提前准备好可能会被问到问题,准备的时候一定要思考简历上每一句话,大部分时候面试官都是对着你的简历临时提问的。当然这部分也会根据你简历的写法引申出八股的提问。2.2场景问题(软实力)这一部分和八股有些重合,但是个人觉得是面试官考验你综合能力的问题,在这一部分中,面试官的提问一般是自己开发中遇到的或者根据你简历上某个点临时想到的。这里真的很考验软实力,对架构设计以及遇到问题的解决方案设计,平时自己写项目的时候做好沉淀,多看看技术博客之类的。在回答的时候一定要总分式。3、八股文这一部分我就简单罗列一下在哪几个方面作出准备,具体内容网上资料很多了。3.1 语言八股3.2 存储中间件八股3.3 消息队列八股3.4 计算机网络/系统八股3.5 开发工具类:Docker、k8s等4、算法题这一部分没得说,考验你的coding能力,talk is cheap,show me your code. 硬刷和总结,当然也很看运气。在这一部分除了力扣上的算法题还有一些其他类型手撕:令牌桶、位运算实现两数加法、单例模式等,这部分我看到了也会进行补充。做不出来的时候有可以小小补救的技巧,可以尝试跟面试官讲解思路和请求换题之类的。5、智力题这个就看自己遇没遇到过和临场发挥了,平时多进行一些总结祝大家都能顺利通过面试拿到一个满意的offer。如果感觉本文有所帮助可以点赞和一个小花花,也欢迎在评论区讨论一些面试小技巧。#牛客激励计划##ai智能作图#
点赞 评论 收藏
分享
评论
点赞
10
分享

创作者周榜

更多
牛客网
牛客企业服务