只读管道(receive-only)和只写管道(send-only)的使用

package main

import "fmt"

func test(sendOnlyChan chan<- int) {
   // sendOnlyChan是只写管道
   fmt.Printf("%+v \n", sendOnlyChan)
}

func main() {
   // 只写管道(只能向其发送数据的管道)
   var sendOnlyChan chan<- int
   sendOnlyChan = make(chan int, 4)
   sendOnlyChan <- 1

   // 错误代码演示(从只写管道读数据)
   num1 := <-sendOnlyChan
   // 错误信息:invalid operation: cannot receive from send-only channel sendOnlyChan (variable of type chan<- int)

   //================================================== 俺是分割线 ==================================================//

   // 只读管道(只能从管道获取数据)
   var receiveOnlyChan <-chan int

   // 错误代码演示(往只读管道写数据)
   receiveOnlyChan <- 2
   // 错误信息:invalid operation: cannot send to receive-only channel receiveOnlyChan (variable of type <-chan int)

   //================================================== 俺是分割线 ==================================================//

   var normalChan chan int // 定义一个可读可写管道
   test(normalChan)        // test()的形参是只写管道,把可读可写管道入参是没问题的
}

//========== 总结 ==========//
// 1、管道默认是可读可写的,但是可以定义只读或只写的管道,需要明白的是只读或只写是管道的属性,而不是数据类型,所以一个
//    自定义函数的形参是只写管道,调用该函数时传入一个可读可写管道并不会报错,但不能传入只读管道。
// 2、只读或只写管道一般用在自定义函数的形参,例如某个自定义函数需要实现的功能仅仅需要往管道写数据而不需要读数据,那就
//    应该把形参定义为只写管道,这样一来可以提高代码安全性,二来可以提高性能。

Copyright © 2024 码农人生. All Rights Reserved