go---通道的基本操作

通道类型是 go 自带的、唯一一个可满足并发安全的类型。

使用 make 声明并初始化一个通道。

一个通道相当于一个 FIFO 队列。元素的发送和接收都用到接送操作符 <-。

package main

import "fmt"

func main(){
	ch1 := make(chan int, 3)  // 声明并初始化了一个元素类型为 int、容量为 3 的通道 ch1
	ch1 <- 2
	ch1 <- 1
	ch1 <- 3
	elem1 := <-ch1
	fmt.Printf("The first element received from channel ch1: %v\n", elem1)
}

在这里插入图片描述
通道的发送和接收操作的基本特性:对于同一个通道,发送操作之间是互斥的,接收操作之间也是互斥的。

发送和接收操作被阻塞的时机:

package main

func main(){
	ch1 := make(chan int, 1)
	ch1 <- 1
	// ch1 <- 2  // 通道满,阻塞

	ch2 := make(chan int, 1)
	// elem, ok := <- ch2  // 通道空,阻塞
	// _, _ = elem, ok
	ch2 <- 1

	var ch3 chan int
	// ch3 <- 1  // 通道为 nil,永久阻塞
	// <- ch3  // 通道为 nil,永久阻塞
	_ = ch3

}

发送和接收操作引发 panic 的时机:

  1. 对已经关闭的通道进行收发操作。
  2. 关闭一个已经关闭的通道。一般让发送方关闭通道,而不是接收方。
package main

import "fmt"

func main(){
	ch1 := make(chan int, 2)

	// 发送方
	go func() {
		for i := 0; i<5; i++ {
			fmt.Printf("Sender: sending element %v...\n", i)
			ch1 <- i
		}
		fmt.Println("Sender: close the channel...")
		close(ch1)
	}()

	// 接收方
	for {
		elem, ok := <- ch1  // ok 为 false,说明通道已关闭
		if !ok {
			fmt.Println("Receiver: closed channel")
			break
		}
		fmt.Printf("Receiver: received an element: %v\n", elem)
	}

	fmt.Println("End.")
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值