请问为啥输出是4,进入的到ch里不是先进先出原则吗,我理解应该是输出是0的呀,求大神解释

XITEHIP · 2018-07-26 16:01:09 · 1111 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2018-07-26 16:01:09 的主题,其中的信息可能已经有所发展或是发生改变。

package main

import( "fmt" )

func main() {

channelInt := make(chan int)

for i:= 0; i < 5; i++ {
    j := i
    go func(j int) {
        channelInt <- j
    }(j)
}
fmt.Printf("==>%d\n", <-channelInt)

}


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1111 次点击  
加入收藏 微博
8 回复  |  直到 2018-07-30 20:15:57
hznuyyh
hznuyyh · #1 · 7年之前

go协程执行的顺序是不定的

Dracula
Dracula · #2 · 7年之前

我跑的是0啊,你跑过了吗?理论上也是0,无缓冲的channel

golwei
golwei · #3 · 7年之前
package main

import (
    "fmt"
    "time"
)

func main() {

    channelInt := make(chan int)

    for i := 0; i < 5; i++ {
        j := i
        go func(x int) {
            channelInt <- x
        }(j)
        time.Sleep(1000)
    }
    fmt.Printf("==>%d\n", <-channelInt)

}
Leigg
Leigg · #4 · 7年之前

结果偶尔4偶尔0,因为你的for循环体没有什么内容,就是在不断创建协程,for循环结束后,这5个协程几乎无间隙连续被创建,在一个极短的时间间隙内创建多个协程,程序并不能精确的判断他们创建的先后顺序。
3楼的代码在for循环内sleep了一下,恰到好处。

kwely
kwely · #5 · 7年之前

####

package main

import "fmt"

func main() {
    //创建无缓冲管道
    channelInt := make(chan int)

    for i := 0; i < 5; i++ {
        j := i
        //每循环一次,都会创建一个子协程
        go func(j int) {
            //新创建的子协程是无规律的执行顺序
            //考虑到CPU的执行速度,以及操作系统的进程轮询计划,所以不确定哪个数先写进管道
            channelInt <- j
            fmt.Printf("现在是子协程执行到i==>%d\n", j)
        }(j)

    }
    fmt.Printf("现在执行主协程\n")
    fmt.Printf("==>%d\n", <-channelInt)
    //可以查看执行结果,就知道为什么你结果一会儿是4或一会儿是0了
}

image.png

Dracula
Dracula · #6 · 7年之前

great

XITEHIP
XITEHIP · #7 · 7年之前
yangdongkui928
yangdongkui928 · #8 · 7年之前

go语法只是创建了一个执行任务,什么时候执行由调度器决定

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传