Today I'm learning channels and goroutine of go. And I met some phenomenon which confuses me.
My go file looks like this:
package main
import (
"fmt"
)
func testRoutine(number int, channel chan int) {
channel <- number
}
func main() {
// var a chan int
a := make(chan int)
b := make(chan int)
go testRoutine(1, a)
go testRoutine(2, b)
c, d := <-a, <-b
fmt.Printf("%d %d\n", c, d)
}
it works well when I used syntax a := make(chan int)
.
But when I changed a := make(chan int)
to var a chan int
, I got panic report:
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan receive (nil chan)]:
main.main()
/Users/marioluisgarcia/Local/practice/go/cache/var_make_diff.go:19 +0xc7
goroutine 18 [chan send (nil chan)]:
main.testRoutine(0x1, 0x0)
/Users/marioluisgarcia/Local/practice/go/cache/var_make_diff.go:8 +0x3f
created by main.main
/Users/marioluisgarcia/Local/practice/go/cache/var_make_diff.go:16 +0x7c
goroutine 19 [chan send]:
main.testRoutine(0x2, 0xc42008a060)
/Users/marioluisgarcia/Local/practice/go/cache/var_make_diff.go:8 +0x3f
created by main.main
/Users/marioluisgarcia/Local/practice/go/cache/var_make_diff.go:17 +0xa7
So, is there any difference between var a chan int
and a := make(chan int)
, and why this panic phenomenon was triggered?
a := make(chan int)
creates unbuffered channel. That channel with zero buffer. You can send data through it.
var a chan int
creates channel variable and sets it to default value which is nil. And a nil channel is always blocking, that's why your program is deadlocked. You can not send data in nil channel.
If you print the values, you will see the difference.
package main
import (
"fmt"
)
func main() {
var i chan int
fmt.Println(i)
a := make(chan int)
fmt.Println(a)
}
Go playground link: https://play.golang.org/p/Bxr6qRfNqZd
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With