开发者学堂课程【Go 语言核心编程 - 面向对象、文件、单元测试、反射、TCP 编程:管道的注意事项和细节(1)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/626/detail/9762
管道的注意事项和细节(1)
内容介绍
一、 channel 可以声明为只读,或者只写性质【案例演示】
二、 只读只写的最佳实践案例
一、channel 可以声明为只读,或者只写性质【案例演示】
讲解:举个例子,新建一个文件 channel 的一个细节,命名为 channeldetails,新建一个案例 demo01,直接写文件 main.go,将通用代码放入
Package main
Import (
“fmt”
)
Func main() {
//管道可以声明为只读或者只写
//1.在默认情况下,管道是双向的,既可读又可写
//Var chan1 chan int //可读可写
//2.声明为只写
Var chan2 chan<- int
讲解:这种情况下,只能往里面写,不能读。举个例子,make 一个空间,chan<-表示它只有写的类型
Chan2 = make(chan int,3)
Chan2<-20
// num := <-chan2//error
fmt.println(“chan2=”,chan2)
讲解:这样表示他有用,出来是一个地址,要记住加上 num
//3.声明为只读
Var chan3 <-chan int
讲解:这种表示只能读不能写
Num2 := <-chan3
//Chan3<- 30//错误
讲解:这种写法是错的,代码会提示
Fmt.println(“num2”,num2)
}
二、只读只写的最佳实践案例
1. 案例1
func main() {
var ch chan int
讲解:是一个双向管道
ch = make(chan int, 10)
exitchan := make(chan struct{}, 2)
讲解:定义一个退出管道
go send(ch, exitchan)
go recv(ch, exitchan)
讲解:编写协程,send、 recv,一个发,一个接,ch这个为只写,表达方式为ch chan<- int, Func send(ch chan<- int,exitchan chan struct{})
这种方法能有效防止出错。而且读写在底层也做了一个优化,效率更高,是最标准的写法。但是要注意管道在这里是只写的。如果要只读则为(ch <-chan int,exitchan chan struct{})
var total
for = range exitchan {
total+
if total == 2 {
break}}
fmt.Println("结束....")}
2. 案例2
// ch chan<-int ,这样ch就只能写操作了
func send(ch chan<- int, exitchan chan struct{})
for i := e; i <10; i++ {
ch <- i}
close(ch)
var a struct{} exitchan<-a
3. 案例3
// ch chan<-int ,这样 ch 就只能写操作了
func send(ch chan<- int, exitchan chan struct{})
for i := e; i <10; i++ {
ch <- i}
close(ch)
var a struct{} exitchan<-a
讲解:它们的管道类型都是 chan int,只读只写是他们的一种属性。
本节重点如下图:
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)