2021-06-25 来源:华纳网 责任编辑:王双双 人气:
核心提示:【谷雨课堂】Go实战第24课信号与管道Chan

知识点:

信号与管道

本课内容:

大家好,欢迎来到谷雨课堂,

 

本节课我们讲一个Go语言中非常有特色,

也是非常重要的功能:

信号与通道

 

在Go程序与其它软件与系统进行通信的过程中,

免不了要进行数据的发送、等待与接收,

所以我们会用到很多的线程去完成,

在这任何语言都会遇到

 

但线程代码处理的不好,

稍有不慎就会出很多问题,

 

所以Go有了这个信号与通道,

极大的方便了这些工作

 

 

信道的英文是channel,

在go当中的关键字是chan。

用来在goroutine(协程)之间传输数据

关于协程,以后我们会详细讲,

你可以简单的认为是线程

 

在并发场景当中,

多个线程彼此隔离的情况下,

需要一个特殊的结构传输数据。

Chan看起来比较怪,在其他语言当中基本没有出现过,但是它的原理和使用都非常简单。

我们先来看它的使用,首先是定义一个chan,

通过make关键字创建。

golang当中的设计原则就是能省则省,能简单则简单。

所以当我们要创建一个chan的时候,可以通过make实现。

 

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
package main
import ("fmt""time")
func main() {
  ch1 := make(chan int)
//启动一个协程go func() {    fmt.Println("等待5秒")    time.Sleep(5 * time.Second)    ch1 <- 48    fmt.Println("等待结束")  }()
  fmt.Println("正在等待任务执行")  //等待直到ch1可用了  i1 := <-ch1  fmt.Println(i1)  fmt.Println("信号结束")
//select的用法cha := make(chan int)chb := make(chan int10)chc := make(chan int20)
go func(c1, c2, c3 chan<- int) {  for {    time.Sleep(1 * time.Second)    c1 <- 1    time.Sleep(1 * time.Second)    c2 <- 2    time.Sleep(1 * time.Second)    c3 <- 3    time.Sleep(5 * time.Second)  }}(cha, chb, chc)
for {  select {  case int1 := <-cha:        fmt.Println("c1 value :", int1)  case int2 := <-chb:        fmt.Println("c2 value :", int2)  case int3 := <-chc:        fmt.Println("c3 vaule :", int3)  case <-time.After(2 * time.Second):        fmt.Println("超时了")  return  } }}

完整的源代码可以登录【华纳网】下载。
 

https://www.worldwarner.com




 





免责声明:本文仅代表作者个人观点,与华纳网无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。