登录
首页 >  Golang >  Go问答

为什么在我的代码中 goroutine 似乎自动冻结循环变量

来源:stackoverflow

时间:2024-04-23 13:30:24 472浏览 收藏

Golang不知道大家是否熟悉?今天我将给大家介绍《为什么在我的代码中 goroutine 似乎自动冻结循环变量》,这篇文章主要会讲到等等知识点,如果你在看完本篇文章后,有更好的建议或者发现哪里有问题,希望大家都能积极评论指出,谢谢!希望我们能一起加油进步!

问题内容

import (
    "fmt"
)


func Print(i int) {
    fmt.Println(i)
}

func PrintR(i *int) {
    fmt.Println(*i)
}


func main() {
    for i := 0; i < 10; i++ {
        go Print(i)   // Get: 1 9 2 3 4 5 7 6 8 0

        //go func() {
        //  Print(i)
        //}()  // Get: 10 10 7 10 4 10 7 10 10 10 10

        //go PrintR(&i)  // Get: 7 10 10 7 10 7 10 10 10 10
    }
    select {

    }
}

第二个、第三个示例得到了预期的输出,但我认为第一种情况的输出 go print(i) 应该与第二个类似,因为它们都没有使用新变量来冻结当前值我。造成这种差异的原因是什么?


解决方案


Go 按值传递参数。您的第一个示例实际上创建了一个新变量,并在启动新 goroutine 之前将当前索引复制到其中,这与您的第三个示例相同。

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《为什么在我的代码中 goroutine 似乎自动冻结循环变量》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>