读写 channel 实战

 一 实战

1 需求

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

2 代码

package main

import "fmt"

func main() {
   var intChan chan int
   intChan = make(chan int, 3)
   intChan <- 10
   intChan <- 20
   intChan <- 30
   // 因为 intChan 的容量为 3,再存放会报 deadlock
   // intChan <- 50
   num1 := <-intChan
   num2 := <-intChan
   num3 := <-intChan
   // 因为 intChan 这时已经没有数据了,再取就会报 deadlock
   //num4 := <- intChan
   fmt.Printf("num1=%v num2=%v num3=%v", num1, num2, num3)
}

3 测试

num1=10 num2=20 num3=30

二 实战

1 需求

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

2 代码

package main

import "fmt"

func main() {
   var mapChan chan map[string]string
   mapChan = make(chan map[string]string, 10)
   m1 := make(map[string]string, 20)
   m1["city1"] = "北京"
   m1["city2"] = "天津"
   m2 := make(map[string]string, 20)
   m2["hero1"] = "松江"
   m2["hero2"] = "武松"
   mapChan <- m1
   mapChan <- m2
   map1 := <-mapChan
   map2 := <-mapChan
   fmt.Printf("len(map1)=%v  len(map2)=%v", len(map1), len(map2))
}

3 测试

len(map1)=2  len(map2)=2

三 实战

1 需求

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

2 代码

package main

import "fmt"

type Cat struct {
   Name string
   Age  int
}

func main() {
   var catChan chan Cat
   catChan = make(chan Cat, 10)
   cat1 := Cat{Name: "tom", Age: 10}
   cat2 := Cat{Name: "tom~", Age: 100}
   catChan <- cat1
   catChan <- cat2
   // 取出
   cat11 := <- catChan
   cat22 := <- catChan
   fmt.Println(cat11, cat22)
}

3 测试

{tom 10} {tom~ 100}

 四 实战

1 需求

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

2 代码

package main

import "fmt"

type Cat struct {
   Name string
   Age  int
}


func main() {
   var catChan chan *Cat
   catChan = make(chan *Cat, 10)
   cat1 := Cat{Name: "tom", Age: 10}
   cat2 := Cat{Name: "tom~", Age: 100}
   catChan <- &cat1
   catChan <- &cat2
   // 取出
   cat11 := <- catChan
   cat22 := <- catChan
   fmt.Println(cat11, cat22)
}

3 测试

&{tom 10} &{tom~ 100}

五 实战

1 需求

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

2 代码

package main

import "fmt"

type Cat struct {
   Name string
   Age  int
}

func main() {
   //var allChan chan interface{}
   allChan := make(chan interface{}, 10)
   allChan <- 10 // 第1个变量
   allChan <- "tom jack" // 第2个变量
   cat := Cat{"小花猫", 4}
   allChan <- cat // 第3个变量
   // 我们希望获得到管道中的第三个元素,则先将前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)
}

3 测试

newCat=main.Cat , newCat={小花猫 4}

newCat.Name=小花猫

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值