代码之家  ›  专栏  ›  技术社区  ›  somejkuser

goroutines的意外输出

  •  -4
  • somejkuser  · 技术社区  · 8 年前

    我使用go concurrency并拥有以下代码:

    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 回复  |  直到 8 年前
        1
  •  2
  •   mbuechmann    8 年前

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