一 实战
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=小花猫