Go channel的使用细节及案例

channel的使用细节

  • channel 使用的注意事项
    • 1) channel 中只能存放指定的数据类型
    • 2) channle 的数据放满后,就不能再放入了
    • 3) 如果从 channel 取出数据后,可以继续放入
    • 4) 在没有使用协程的情况下,如果 channel 数据取完了,再取,就会报 dead lock

读写 channel 案例演示

  • 创建一个intChan,最多可以存放3个int,演示存3数据到intChan,然后再取出这三个int


  • 创建一个mapChan,最多可以存放10个map[string]string的key-al,演示写入和读取。


  • 创建一个catChan,最多可以存放10个Cat结构体变量,演示写入和读取的用法
     


  • 创建一个catChan2,最多可以存放10个*Cat变量,演示写入和读取的用法


  • 创建一个allChan,最多可以存放10个任意数据类型变量,演示写入和读取的用法


  • channel是空接口类型,注意类型断言
type Cat struct {
	Name string
	Age int
}

func main() {

	//定义一个存放任意数据类型的管道 3个数据
	//var allChan chan interface{}
	allChan := make(chan interface{}, 3)

	allChan<- 10
	allChan<- "tom jack"
	cat := Cat{"小花猫", 4}
	allChan<- cat

	//我们希望获得到管道中的第三个元素,则先将前2个推出
	<-allChan
	<-allChan

	newCat := <-allChan //从管道中取出的Cat是什么?

	fmt.Printf("newCat=%T , newCat=%v\n", newCat, newCat)
	//下面的写法是错误的!编译不通过
	//fmt.Printf("newCat.Name=%v", newCat.Name)
	//使用类型断言
	a := newCat.(Cat) 
	fmt.Printf("newCat.Name=%v", a.Name)
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
channel 是 Go 语言中的一个核心特性,它允许不同的 goroutine 之间进行通信和同步。以下是 channel 的一些使用案例: 1. 并发任务的协调 在一个并发任务中,可能需要多个 goroutine 协同工作,彼此之间需要进行数据传递和同步。这时可以使用 channel 来协调不同的 goroutine,确保它们按照正确的顺序执行。例如,可以使用一个 channel 来传递任务和结果,让不同的 goroutine 同时处理任务,最后把结果传回主 goroutine 进行处理。 2. 生产者-消费者模型 在生产者-消费者模型中,一个或多个生产者会生成数据,而一个或多个消费者会消费这些数据。这时可以使用 channel 作为一个缓冲区来存储数据,让生产者将数据写入 channel,让消费者从 channel 中读取数据。这种方式可以避免生产者和消费者之间的竞争条件,确保每个数据都能被正确地处理。 3. 信号量 在某些场景下,需要限制并发的数量,以避免资源的过度消耗。这时可以使用 channel 作为一个信号量,限制同时执行的 goroutine 数量。例如,可以创建一个有缓冲的 channel,容量为 N,然后在每个 goroutine 开始执行前从 channel 中读取一个元素,在执行完成后再将元素写回 channel。这样可以保证同时执行的 goroutine 数量不超过 N。 4. 事件驱动编程 在事件驱动编程中,需要监听一些事件,当事件发生时执行相应的操作。这时可以使用 channel 来实现事件的监听和触发。例如,可以创建一个 channel,然后将它传递给一个事件监听器。当事件发生时,监听器就可以向 channel 中写入一个,通知主 goroutine 执行相应的操作。 总之,channel 是 Go 语言中非常强大的一种并发编程工具,可以在各种场景下使用,提高程序的并发性能和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值