golang中Channel通道(一)

golang中Channel通道(一)

一、Channel通道的基本使用

Channel通道在使用的时候,有以下几个注意点︰

1.用于goroutine,传递消息的。

⒉通道,每个都有相关联的数据类型,nil chan,不能使用,类似于nil map,不能直接存储键值对

3.使用通道传递数据:<-
chan <- data,发送数据到通道。向通道中写数据
data = <- chan,从通道中获取数据。从通道中读数据

4.阻塞:
发送数据:chan <- data,阻塞的,直到另一条goroutine,读取数据来解除阻塞
读取数据: data= <- chan,也是阻塞的。直到另一条goroutine,写出数据解除阻塞。

5.本身channel就是同步的,意味着同一时间,只能有一条goroutine来操作。
最后:通道是goroutine之间的连接,所以通道的发送和接收必须处在不同的goroutine中。

实例

package main

import "fmt"
//通道的基本演示
func main() {
	var ch1 chan bool
	//不带缓冲的通道
	ch1 = make(chan bool)
	go func() {
		for i:=0;i<10;i++{
			fmt.Println("子goroutine中,i:",i)
		}
		//循环结束后,向通道中写入数据,表示中断程序
		ch1<-true
		fmt.Println("结束、、、")
	}()
	//当ch1中还未存入数据时,data一直阻塞
	data:=<-ch1
	fmt.Println("main...data-->",data)
}

二、关闭Channel通道的基本使用

goroutine,写入数据10个
每写一个,阻塞一次,主程序读取一次,解除阻塞

主goroutine:循环读
每次读取一个,堵塞一次,子程序,写入一个,解除阻塞

发送方,关闭通道的--->接收方,接收到的数据是该类型的零值,以及false
package main

import (
	"fmt"
	"time"
)
//关闭通道案例
func main() {
	//不带缓冲的通道
	ch1:=make(chan int)
	go sendData(ch1)
	
	//获取通道的数据
	//法一
	//for{
	//	//time.Sleep(time.Second)
	//	v,ok:=<-ch1
	//	if !ok{
	//		fmt.Println("已经读取了所有的数据,",ok)
	//		break
	//	}
	//	fmt.Println("取出数据:",v,ok)
	//}
	//法二  推荐
	for v:= range ch1{
		fmt.Println("取出数据:",v)
	}

	fmt.Println("main over.")
}
func sendData(ch1 chan int)  {
	//发送方
	for i:=0;i<10;i++{
		time.Sleep(time.Second)
		ch1 <- i
	}
	//这里如果不关闭channel的话,会导致死锁
	//fatal error: all goroutines are asleep - deadlock!
	//关闭channel,主要是为了主程序中不会一直处于读取状态
	close(ch1)
}

你可能感兴趣的:(并发,通道,线程,golang,go,后端,开发语言)