PS: https://play.golang.org/p/ax_bsnEJ1Q

I added more goroutine to see what the result would be:

package main

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

func main() {
runtime.GOMAXPROCS(1)
wg := sync.WaitGroup{}

for i := 0; i < 5; i++ {
wg.Add(1)
fmt.Printf("%d: main\n", i)
go func (i int) {
fmt.Printf("%d: not main\n", i)
wg.Done()
} (i)
}

//time.Sleep(1 * time.Nanosecond)
wg.Wait()
}

https://play.golang.org/p/19bgbXJ54-



The result is like this:

0: main
1: main
2: main
3: main
4: main
4: not main
0: not main
1: not main
2: not main
3: not main

The fifth goroutine got executed first(except for the main goroutine).

And if I put the main goroutine to sleep for some time by uncomment the 
sleep line, the result is:


0: main
1: main
2: main
3: main
4: main
0: not main
1: not main
2: not main
3: not main
4: not main


 I am really confused with the results.


在 2017年8月20日星期日 UTC+8下午12:57:43,Yp Xie写道:
>
> Hi guys,
>
> I am learning golang with the fantastic book "Go in Action". And I have 
> some problems with understanding when to switch a goroutine to be run in 
> chapter 6.
>
>     package main                                                           
>      
>   1  
>   2 import (
>   3     "fmt"
>   4     "runtime"
>   5     "sync"
>   6 )
>   7  
>   8 func main() {
>   9     runtime.GOMAXPROCS(1)
>  10  
>  11     var wg sync.WaitGroup
>  12     wg.Add(2)
>  13  
>         // first goroutine
>  14     go func() {
>  15         defer wg.Done()
>  16         for c := 0; c < 3; c++ {
>  17             for char := 'a'; char < 'a'+26; char++ {
>  18                 fmt.Printf("%c", char)
>  19             }
>  20         }
>  21         fmt.Println("")
>  22     }()
>  23     
>         // second goroutine
>  24     go func() {
>  25         defer wg.Done()
>  26         for c := 0; c < 3; c++ {
>  27             for char := 'A'; char < 'A'+26; char++ {
>  28                 fmt.Printf("%c", char)
>  29             }
>  30         }
>  31         fmt.Println("")
>  32     }()
>  33  
>  34     wg.Wait()
>      }
>
>
> Why the result is printing uppercase letters first?
>
> I mean the two goroutines are passed in a waiting queue in order of the 
> time they were generated, and they were meant to be executed in the same 
> order.
>
> So why the second goroutine got executed first? 
>
> Or is the fmt.Println method is IO-related?
>
> Please help me understand this situation.
>
> Thanks!
>
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to