来自goroutines的意外输出

时间:2018-06-14 14:25:33

标签: go concurrency

我正在使用Go并发并拥有以下代码:

package main

import (
    "fmt"
    "runtime"
    "sync"
)

func main() {
    runtime.GOMAXPROCS(1)
    var wg sync.WaitGroup
    wg.Add(2)
    fmt.Println("Starting Goroutines")
    go func() {
        defer wg.Done()
        for count := 0; count < 3; count++ {
            for char := 'a'; char < 'a'+26; char++ {
                fmt.Printf("%c", char)
            }
        }
        fmt.Println()
    }()
    go func() {
        defer wg.Done()
        for count := 0; count < 3; count++ {
            for char := 'A'; char < 'A'+26; char++ {
                fmt.Printf("%c", char)
            }
        }
        fmt.Println()
    }()
    fmt.Println("Waiting to Finish")
    wg.Wait()
    fmt.Println("Terminating")
}

我的输出是:

Starting Goroutines
Waiting to Finish
ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz
Terminating

我的问题是我声明第一个goroutine显示小写字母,第二个goroutine显示大写字母。输出不应该先小写,然后是大写吗?

任何解释都会有所帮助。

注意:此代码来自Go In Action电子书,我没有完全理解他们的解释。

1 个答案:

答案 0 :(得分:2)

每次执行程序时,输出都会有所不同。 go例程的执行顺序无法保证。因此,您的输出不是确定性的。