陈Golang通道是什么

  介绍

这篇文章给大家分享的是有关Golang通道陈是什么的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。

首先我们来看线程,在Golang里面也叫goroutine

在读这篇文章之前,我们需要了解一下并发与并行.golang的线程是一种并发机制,而不是并行。它们之间的区别大家可以上网搜一下,网上有很多的介绍。

下面我们先来看一个例子吧

import (   “fmt"   )      funcmain () {      fmt.Println (“1“)   fmt.Println (“2“)   }

在golang里面,使用去这个关键字,后面再跟上一个函数就可以创建一个线程。后面的这个函数可以是已经写好的函数,也可以是一个匿名函数

funcmain () {var我=3 func (int) {fmt.Println (a)   fmt.Println (“1“)   }(我)   fmt.Println (“2“)}

上面的代码就创建了一个匿名函数,并且还传入了一个参数,我下面括号里的我是实参,一个是形参。

那么上面的代码能按照我们预想的打印1,2,3吗?告诉你们吧,不能,程序只能打印出2。下面我把正确的代码贴出来吧

import (“fmt"   “time") funcmain () {var我=3 func (int) {fmt.Println (a)   fmt.Println (“1“)   }(我)   fmt.Println (“2“)   时间。睡眠(1 * time.Second)}

我只是在最后加了一行让主线程休眠一秒的代码,程序就会依

次打印出2、3、1。
那为什么会这样呢?因为程序会优先执行主线程,主线程执行完成后,程序会立即退出,没有多余的时间去执行子线程。如果在程序的最后让主线程休眠1秒钟,那程序就会有足够的时间去执行子线程。

线程先讲到这里,下面我们来看看通道吧。

通道又叫频道,顾名思义,通道的作用就是在多线程之间传递数据的。

创建无缓冲频道

chreadandwrite:=让陈(int)

chonlyread:=(& lt;脚板int)//创建只读频道
chonlywrite:=(chan<- int)//创建只写频道
下面我们来看一个例子:

 ch:=(陈int, 1)
  ch & lt; - 1
  去func () {
  v:=& lt; ch
  fmt.Println (v)
  }()
  时间。睡眠(1 * time.Second)
  fmt.Println (“2“) 

这样的话程序就会依次打印出1、2

2,把ch<1这一行代码放到子线程代码的后面,代码如下:

进口(“fmt"
  “time")函数产生(p chan<- int){因为我:=0;我& lt;10;我+ + {
  p & lt;——我
  fmt.Println(“发送:“,我)
  }
  }func消费者(c & lt;脚板int){因为我:=0;我& lt;10;我+ + {
  v:=& lt; - c
  fmt.Println(“接受:“v)
  }
  }函数main () {
  陈ch:=(int)去生产(ch)消费者(ch)
  时间。睡眠(1 * time.Second)
  }

在这段代码中,因为频道是没有缓冲的,所以当生产者给通道赋值后,生产者这个线程会阻塞,直到消费者线程将通道中的数据取出。消费者第一次将数据取出后,进行下一次循环时,消费者的线程也会阻塞,因为生产者还没有将数据存入,这时程序会去执行生产者的线程。程序就这样在消费者和生产者两个线程间不断切换,直到循环结束。

陈Golang通道是什么