Abner的博客

Go基础-信道

· 157 words · 1 minutes to read
Categories: Go

信道是协程之间通信的管道,从一端发送数据,另一端接收数据。

信道声明 🔗

  • var c chan int,声明了 nil 信道。nil 信道没什么作用,既不能发送数据也不能接受数据
  • c:=make(chan int),使用 make 函数创建了可用的信道 c。

+++

读写数据 🔗

c := make(chan int)
// 写数据
c <- data   

// 读数据
variable <- c  // 方式一
<- c              // 方式二

+++

解决生产环境使用timeSleep 🔗

func printHello(c chan bool) {
    fmt.Println("hello world goroutine")
    <- c    // 读取信道的数据
}
 
func main() {
    c := make(chan bool)
    go printHello(c)
    c <- true    // main 协程阻塞
    fmt.Println("main goroutine")
}
//output
hello world goroutine
main goroutine

+++

死锁(只读不写或者只读不写) 🔗

func main() {
    c := make(chan bool)
    c <- true    // 只写不读
    fmt.Println("main goroutine")
}

+++

关闭信道与 for loop 🔗

func printNums(ch chan int) {
    for i := 0; i < 10; i++ {
        ch <- i
    }
    close(ch)
}

func main() {
    ch := make(chan int)
    go printNums(ch)
    for {
        v, ok := <-ch
        if ok == false {     // 通过 ok 判断信道是否关闭
            fmt.Println(v, ok)
            break
        }
        fmt.Println(v, ok)
    }
}

+++

缓冲信道和普通信道 🔗

普通信道是无缓冲的,读写信道会立马阻塞当前协程。对于缓冲信道,写不会阻塞当前信道直到信道满了,同理,读操作也不会阻塞当前信道除非信道没数据

总结 🔗

{% post_link Go/channel总结 [channel总结]%}

Tags