新手求助,win7下和Ubuntu一段代码结果不同?

wy04313 · 2017-12-05 00:51:28 · 886 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2017-12-05 00:51:28 的主题,其中的信息可能已经有所发展或是发生改变。

在Ubuntu下会把切片里的元素全部输出,但是win7下不行,我是在学一本go书籍中看到的这个实例,按着书中所述,runtime.Gosched()应该放在for循环外,那样在win7和Ubuntu切片都不能全部输出.我理解的是放在切片内,但是只能在Ubuntu中可以全部输出???这个是为什么???runtime.Gosched()到底应该放在for外还是for里???高手帮着解答下,万分感激!!!

package main

import (
    "fmt"
    "runtime"
)

func main() {
    names := []string{"li", "wang", "zhang", "song", "liu", "ye"}
    for _, name := range names {
        go func(who string) {
            fmt.Println(who, "是谁?")
        }(name)
        runtime.Gosched()
    }
}

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

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

886 次点击  
加入收藏 微博
2 回复  |  直到 2017-12-05 16:37:15
channel
channel · #1 · 7年之前

放在里面能运行的可能性更大。注意,我这里说的是可能性。

Gosched 文档说明如下:

Gosched yields the processor, allowing other goroutines to run. It does not suspend the current goroutine, so execution resumes automatically. go:nosplit

可见,调用 Gosched 并不能保证当前 goroutine 一定不会继续运行。也就是说,你这里即使调用它,main goroutine 也有可能继续执行,然后程序终止,其他 goroutine 还没有运行。所以,按概率,放在 for 里面全部执行的可能性更大,但要保证全部都执行,请在 main goroutine 中做其他处理,比如 sleep 或 wait

admin87
admin87 · #2 · 7年之前

让主程序等一下

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