Golang管道死锁调试学习

Golang没有缓冲的管道是会等待输出才能输入,看到一个案例想调试了一下

package main

import (
    "fmt"
)

var ch1, ch2 chan int

func send() {
    ch1 <- 1
    ch2 <- 2
}

func main() {
    go send()

    fmt.Println(`ch1`, <-ch1)
    fmt.Println(`ch2`, <-ch2)
}

执行

fatal error: all goroutines are asleep - deadlock!

想这个是顺序执行的,怎么会死锁,然后发现channel和map slice一样,需要make后才能使用
修改:

package main

import (
    "fmt"
)

var ch1, ch2 chan int

func send() {
    ch1 <- 1
    ch2 <- 2
}

func main() {
    ch1 = make(chan int)
    ch2 = make(chan int)
    go send()

    fmt.Println(`ch1`, <-ch1)
    fmt.Println(`ch2`, <-ch2)
}

正常返回

ch1 1
ch2 2

替换ch1 ch2发送顺序,不改变接受顺序

func send() {
    ch2 <- 2
    ch1 <- 1
}

执行

fatal error: all goroutines are asleep - deadlock!

死锁再现,因为先发送了管道ch2,先接收ch1,因为ch1没有发送,协程卡主,就导致主线程ch1 没法发送, 死循环,生成了死锁。