http://blog.csdn.net/kjfcpua/article/details/18265441異步
unc main() {
nat := make(chan int)
squ := make(chan int)
go func() {
for x := 0; x < 100; x++ {
nat <- x
}
}() //沒有close(nat) 形成死鎖 ?爲何會死鎖呢
//fatal error: all goroutines are asleep - deadlock!.net
//goroutine 1 [chan receive]:blog
go func() {
for {
if x, ok := <-nat; !ok {
break
} else {
squ <- x * x
}
}
close(squ)
}()
for x := range squ {
fmt.Println(x)
}
}
以下是不會死鎖的,也不會阻塞是由垃圾回收器回收。
func main() {
nat := make(chan int)
go func() {
for x := 0; x < 100; x++ {
nat <- x
}
}()
}
package main
import (
"fmt"
"sync"
)
func test1() int {
sizes := make(chan int)
var wg sync.WaitGroup
for i := 0; i < 5; i++ {
wg.Add(1)
go func(i int) {
defer wg.Done()
fmt.Println("i:", i)
sizes <- i
}(i)
}
fmt.Println("下一步")
go func() { //若是不用go,則是在main的goroutine中執行,則wg.Wait()會等待,阻塞了主進程,形成死鎖。不要阻塞主進程。
wg.Wait()
close(sizes)
}()
var total int
for size := range sizes {
fmt.Println("循環:", size)
total += size
}
return total
}
func main() {
fmt.Println(test1()) //test1是位於main這個主goroutine中的。
下一步 //位於主goroutine中,先執行
i: 3 //寫和讀,都是異步的
i: 4
循環: 3
i: 0
循環: 4
循環: 0
i: 1
i: 2
循環: 1
循環: 2
10進程
}