ZhangZhihui's Blog  

main.go:

package main

import "fmt"

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

Got error:

zzh@ZZHPC:/zdata/MyPrograms/Go/testing$ go run main.go
fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan send]:
main.main()
        /zdata/MyPrograms/Go/testing/main.go:7 +0x36
exit status 2

Cause:

The channel is unbuffered, so when you try to send a value down that channel, it blocks forever, waiting for someone to fetch a value. You need to start a new goroutine, or make the channel buffered and use it as an array.

Both sending and retrieving data through non-buffered channel are blocking processes.

So below code also got error:

package main

import "fmt"

func main() {
    ch := make(chan int)
    a := <-ch
    fmt.Println(a)
}
zzh@ZZHPC:/zdata/MyPrograms/Go/testing$ go run main.go
fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan receive]:
main.main()
        /zdata/MyPrograms/Go/testing/main.go:7 +0x2f
exit status 2

Changing the channel to a buffered one without sending a value to it CANNOT fix the error:

package main

import "fmt"

func main() {
    ch := make(chan int, 1)
    a := <-ch
    fmt.Println(a)
}
zzh@ZZHPC:/zdata/MyPrograms/Go/testing$ go run main.go
fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan receive]:
main.main()
        /zdata/MyPrograms/Go/testing/main.go:7 +0x32
exit status 2

 

Correction 1:

package main

import "fmt"

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

Correction 2:

package main

import "fmt"

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

Both got below result:

zzh@ZZHPC:/zdata/MyPrograms/Go/testing$ go run main.go
1

 

posted on 2023-09-27 16:18  ZhangZhihuiAAA  阅读(21)  评论(0编辑  收藏  举报