有没有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 回复 分享
发布于 07-09 19:36 AI生成
循环变量是共享的,不过似乎go 1.22已经填补了这个坑
1 回复 分享
发布于 07-09 20:33 北京
9012345678,9 协程是最后创建的,会直接运行 9 协程,然后在按队列顺序运行, 可以看下协程创建的源码
1 回复 分享
发布于 07-21 09:37 北京
字节组内实习生招聘,同学感兴趣可以私聊
点赞 回复 分享
发布于 07-18 14:41 广东
这是啥题
点赞 回复 分享
发布于 08-01 17:47 北京
什么鬼 根本看不懂
点赞 回复 分享
发布于 08-02 16:31 北京
是一道用来理解 gmp 调度机制的蛮好的题,可以配合曹大的 go 调度相关博文来理解,也可以像楼上说的直接扎进源码里看👀
点赞 回复 分享
发布于 08-10 01:30 浙江
go大佬在这里【干了3年go,吹嘘下不过分吧】 给你解释下这段代码。 涉及到协程的一些知识。 第一段代码,由于循环变量未传入到协程,协程与for循环使用的是同一个循环变量 i, 协程是并发不阻塞的。也就是在执行协程的同时,for循环也在执行。所以打印的结果其实是不确定的,要先理解并发的概念,并发并发就是不分先后,不分先后的意思是不确定先后,但实际执行其实是有先后的,只是这个先后是不确定的。所以实际打印的结果跟各自的机器有关系,你换一台机器打印的结果可能就不一样了。 第二段代码,循环变量 i 传入到协程里,协程都会有一个协程栈空间,这个i传入到协程占栈空间里,也就创建了一个副本,copy了一份,所以每个协程里的值其实是确定的,也就是for循环的i传入的值。 基础知识点:协程,并发,协程栈空间。多说一句,这并不是什么bug哈。
点赞 回复 分享
发布于 08-15 21:00 上海
答案奇怪是指什么,没实际跑过。两个循环并发,上面的goroutine打印循环变量i,这个地址是共享的,有读有写有竞态,因此上面的循环不保证打印出所有的0-10,下面的打印拷贝到函数内部的循环变量i,没有竞态问题,因此能输出0-10。20个goroutine没有同步,因此可能以任意顺序执行
点赞 回复 分享
发布于 08-17 07:03 四川
这种直接gpt呀,
点赞 回复 分享
发布于 08-23 10:22 广东

相关推荐

点赞 11 评论
分享
牛客网
牛客企业服务