【golang笔记】go_channel只读和只写(25)

Page content

这一篇简单的整理了golang channel只读和只写 相关的内容。

1.channel的只读和只写声明方式

package main
import (
 "fmt"
)

func main() {
 //管道可以声明为只读或者只写

 //1. 在默认情况下下,管道是双向
 //var chan1 chan int //可读可写
 
 //2 声明为只写
 var chan2 chan<- int
 chan2 = make(chan int, 3)
 chan2<- 20
 //num := <-chan2 //error

 fmt.Println("chan2=", chan2)

 //3. 声明为只读
 var chan3 <-chan int
 num2 := <-chan3
 //chan3<- 30 //err
 fmt.Println("num2", num2)
}

2.实际用处

package main

import (
 "fmt"
)

//ch chan<- int, 这样ch就只能做写操作
func send(ch chan<- int, exitChan chan struct{}) {
 for i := 0; i < 10; i++ {
  ch <- i
 }
 close(ch)
 var a struct{}
 exitChan <- a
}

// ch <-chan int, 这样ch就只能做读操作
func recv(ch <-chan int, exitChan chan struct{}) {
 for {
  v, ok := <-ch
  if !ok {
   break
  }
  fmt.Println(v)
 }
 var a struct{}
 exitChan <- a
}

func main() {
 var ch chan int
 ch = make(chan int, 10)
 exitChan := make(chan struct{}, 2)
 go send(ch, exitChan)
 go recv(ch, exitChan)

 for i := 0; i < 2; i++ {
  <-exitChan
 }
 fmt.Println("结束")
}

欢迎大家的意见和交流

email: li_mingxie@163.com