go语言中实现同一个通道数据的读与写功能示例代码

2023-06-01 00:00:00 语言 示例 通道

需求:

开启一个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类型变量值 12

相关文章