3

定向通道是只能发送or只能接收数据的通道。


双向通道是这样的:

package main
import "fmt"
func main() {
    ch1 := make(chan string)
    //建立一个chanel 通知一下 在子协程没结束之前 主协程不要结束
    done := make(chan bool)
    go sendData(ch1, done)
    data := <-ch1
    fmt.Println("子协程中传来的数据: ", data)
    ch1 <- "that is rain"
    <-done
    fmt.Println("main finished")
}
func sendData(ch1 chan string, done chan bool) {
    ch1 <- "this is bill"
    data := <-ch1
    fmt.Println("主协程传来的数据", data)
    //这个表示在子的协程结束的时候 再传递一个 bool 告诉 主协程 子协程已经执行完毕,否则主协程先不要结束
    done <- true
}

运行结果是这样的:

子协程中传来的数据:  this is bill
主协程传来的数据 that is rain
main finished

以上就是双向通道的写法,下面介绍一下单向通道:

package main

import "fmt"

func main() {
    //双向chanel
    ch1 := make(chan int)
    //单向:只能写
    //ch2 := make(chan<- int)
    ////单向:只能读
    //ch3 := make(<-chan int)

    go writes(ch1)
    //go writes(ch2)
    data := <-ch1
    fmt.Println("the data from writes is : ", data)
}

func writes(ch chan<- int) {
    ch <- 100
    fmt.Println("writing completed")
}

对于所谓的单向chanel,在创建之初,通常还是会创建一个双向的通道,只不过在函数(比如这里的writes中设为只能写)。

参考:bilibili


LiberHome
409 声望1.1k 粉丝

有问题 欢迎发邮件 📩 liberhome@163.com