channel的使用细节
- channel 使用的注意事项
- 1) channel 中只能存放指定的数据类型
- 2) channle 的数据放满后,就不能再放入了
- 3) 如果从 channel 取出数据后,可以继续放入
- 4) 在没有使用协程的情况下,如果 channel 数据取完了,再取,就会报 dead lock
读写 channel 案例演示
- 创建一个intChan,最多可以存放3个int,演示存3数据到intChan,然后再取出这三个int
- 创建一个mapChan,最多可以存放10个map[string]string的key-al,演示写入和读取。
- 创建一个catChan,最多可以存放10个Cat结构体变量,演示写入和读取的用法
- 创建一个catChan2,最多可以存放10个*Cat变量,演示写入和读取的用法
- 创建一个allChan,最多可以存放10个任意数据类型变量,演示写入和读取的用法
- channel是空接口类型,注意类型断言
type Cat struct { Name string Age int } func main() { //定义一个存放任意数据类型的管道 3个数据 //var allChan chan interface{} allChan := make(chan interface{}, 3) allChan<- 10 allChan<- "tom jack" cat := Cat{"小花猫", 4} allChan<- cat //我们希望获得到管道中的第三个元素,则先将前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) }