go语言中实现同一个通道数据的读与写功能示例代码
Go  /  管理员 发布于 3年前   981
需求:
开启一个writeData协程,向协程里面写数据。
开启一个readData协程,向协程里面读数据。
使用同一个通道实现数据的读与写。
代码示例1:
package main
import (
	"fmt"
	"time"
)
var (
	channelLen int = 10
)
// 向通道写入数据
func writeData(channel chan int) {
	for i := 0; i < channelLen; i++ {
		fmt.Printf("向管道channel写入数据%d, %d\n",i , len(channel))
		channel <- i
	}
	// close(channel)
}
// 向通道读取数据
func readData(channel chan int) {
	for v := range channel {
		fmt.Println("读取通道channel值", v)
	}
}
func main() {
	// 1. 开启一个writeData协程,向协程里面写数据。
	// 2. 开启一个readData协程,向协程里面读数据。
	// 3. 使用同一个通道实现数据的读与写。
	channel := make(chan int, channelLen)
	
	go writeData(channel)
	go readData(channel)
	time.Sleep(time.Second * 2)
}
//输出
向管道channel写入数据0, 0
向管道channel写入数据1, 0
向管道channel写入数据2, 1
向管道channel写入数据3, 2
向管道channel写入数据4, 3
向管道channel写入数据5, 4
读取通道channel值 0
向管道channel写入数据6, 5
向管道channel写入数据7, 5
向管道channel写入数据8, 6
向管道channel写入数据9, 7
读取通道channel值 1
读取通道channel值 2
读取通道channel值 3
读取通道channel值 4
读取通道channel值 5
读取通道channel值 6
读取通道channel值 7
读取通道channel值 8
读取通道channel值 9代码示例2:
package main
import (
	"fmt"
)
type Animal struct {
	Name string
	Age  int
}
func main() {
	fmt.Println("---------------管道基础实现---------------")
	// 1. 管道的创建、发送、接受和关闭。
	var channel chan int
	channel = make(chan int, 100)
	for i := 0; i < 10; i++ {
		channel <- i
	}
	close(channel) // fatal error: all goroutines are asleep - deadlock!
	for v := range channel {
		fmt.Println("channel", v)
	}
	fmt.Println("---------------管道存储任何数据类型---------------")
	// 1. 管道存储任何类型
	var channel1 chan interface{}
	channel1 = make(chan interface{}, 10)
	animal := Animal{Name: "zongscan", Age: 12}
	channel1 <- animal // 发送结构体变量
	channel1 <- 12     // 发送int类型变量
	// 获取到管道类型数据
	animalInfo := <-channel1
	fmt.Println(animalInfo)
	//fmt.Println(animalInfo.Name) // ./channel1.go:38:36: animalInfo.Name undefined (type interface {} is interface with no methods)
	fmt.Println(animalInfo.(Animal).Name) // 断言获取结构体中属性
	close(channel1)
	for v := range channel1 {
		if vv, res := v.(Animal); res {
			fmt.Println("名称", vv.Name)
		}
		fmt.Println("Int类型变量值", v)
	}
}//输出
---------------管道基础实现---------------
channel 0
channel 1
channel 2
channel 3
channel 4
channel 5
channel 6
channel 7
channel 8
channel 9
---------------管道存储任何数据类型---------------
{zongscan 12}
zongscan
Int类型变量值 12122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
			Copyright·© 2019 侯体宗版权所有·
			粤ICP备20027696号
			
			
