golang github死锁挑战二

https://github.com/GoesToEleven/GolangTraining/blob/master/22_go-routines/10_deadlock-challenges/03_deadlock-challenge/main.go

package main

import (
    "fmt"
)

func main() {

    c := make(chan int)

    go func() {
        for i := 0; i < 10; i++ {
            c <- i
        }
    }()

    fmt.Println(<-c)

}
//为什么只显示零?
//并且该怎么做才能打印所有0-9个数字?

解决方法一

停止携程 用for读取通道

package main

import (
    "fmt"
)

func main() {

    c := make(chan int)

    go func() {
        for i := 0; i < 10; i++ {
            c <- i
        }
        //关闭通道
        close(c)
    }()

    for {
        x, ok := <-c  //如果不关闭通道的话 这里会导致死锁,因为通道中没有值写入 这里一直一直一直会等待导致死锁
        if !ok { //判断通道是否关闭
            return
        }
        fmt.Println(x, ok)
    }

}

解决方法二

停止携程 用使用for-range读取通道

package main

import (
    "fmt"
)

func main() {

    c := make(chan int)

    go func() {
        for i := 0; i < 10; i++ {
            c <- i
        }
        //关闭通道
        close(c)
    }()

    for v := range c {
        fmt.Println(v)
    }
}

兴趣话题

下面代码为什么 会无限输出000000000000000000000000000.......?

package main

import (
    "fmt"
)

func main() {

    c := make(chan int)

    go func() {
        for i := 0; i < 10; i++ {
            c <- i
        }
        //关闭通道
        close(c)
    }()

    for {
        fmt.Println(<-c) //为什么会一直输出00000000000000?
    }
    // for v := range c {
    //     fmt.Println(v)
    // }
}

golang github死锁挑战一

https://github.com/GoesToEleven/GolangTraining/tree/master/22_go-routines/10_deadlock-challenges

package main

import (
    "fmt"
)

func main() {
    c := make(chan int)
    c <- 1
    fmt.Println(<-c)
}
//这会导致死锁。
//您能确定原因吗?
//而您将如何解决?

解决方法一:

通道加缓存

package main

import (
    "fmt"
)

func main() {
    c := make(chan int,1)
    c <- 1
    fmt.Println(<-c)
}

解决方法二:

加协程

package main

import (
    "fmt"
)

func main() {
    c := make(chan int)
    go func() {
        c <- 1
    }()
    fmt.Println(<-c)
}