go中channe和gorutinue的应用实例

1. 实例一

在这里插入图片描述

package main

import "fmt"

func main(){
	data:= make(chan int, 10)
	flag := make(chan bool, 1)
	go write(data)
	go read(data, flag)
	// 这块也是可以使用 sync.WaitGroup来进行实现的
	for{
		// 能够正常取出数据就是ok 否则是false
		if _, ok := <-flag; !ok{
			break
		}
	}
	fmt.Println("程序运行结束")
}

func read(ch <-chan int, flag chan<- bool) {
	for{
		data, ok := <-ch
		if !ok{
			break
		}
		fmt.Println("读出的数据为:",data)
	}
	flag <- true
	// 这块也是应该将flag的这个channel进行关闭操作的
	close(flag)
}

func write(ch chan<- int) {
	for i:=0; i<50; i++{
		ch <- i
		fmt.Println("写入数据:", i)
	}
	// 最后一定要进行channel的关闭
	// 因为数据已经写入完成
	close(ch)
}

2. 示例二

package main

import (
	"fmt"
	"sync"
)

var(
	wg sync.WaitGroup

)

func main(){
	data := make(chan int, 200)
	res := make(chan int, 200)
	wg.Add(1)
	go putData(data)
	for i:=0; i<4; i++{
		wg.Add(1)
		go acl(data, res)

	}
	// 注意不能再这close 掉res
	// close(res)
	wg.Wait()
	// 应该再这进行close的操作的
	close(res)
	for i:=range res{
		fmt.Println("打印的数据:", i)
	}
	fmt.Println("main函数结束了")
}

func acl(data chan int, res chan int) {
	for{
		tem, ok := <-data
		if !ok{
			break
		}
		res <- tem*tem
	}
	wg.Done()
}

func putData(data chan<- int) {
	for i:=1; i<500; i++{
		data <- i
	}
	close(data)
	wg.Done()
}package main

import (
	"fmt"
	"sync"
)

var(
	wg sync.WaitGroup

)

func main(){
	data := make(chan int, 20)
	res := make(chan int, 500)
	wg.Add(1)
	go putData(data)
	for i:=0; i<4; i++{
		wg.Add(1)
		go acl(data, res)

	}
	// 注意不能再这close 掉res
	// close(res)
	wg.Wait()
	// 应该再这进行close的操作的
	close(res)
	for i:=range res{
		fmt.Println("打印的数据:", i)
	}
	fmt.Println("main函数结束了")
}

func acl(data chan int, res chan int) {
	for{
		tem, ok := <-data
		if !ok{
			break
		}
		// 这里面的res的大小一定要是500 
		// 因为这个channel是没有读数据的  
		// 只有写数据的
		res <- tem*tem
	}
	wg.Done()
}

func putData(data chan<- int) {
	for i:=1; i<500; i++{
		data <- i
	}
	close(data)
	wg.Done()
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值