Golang channel【管道】的声明和使用
一:channel的初始化
//语法
var 变量名 chan 类型
变量名 = make(chan 类型,大小)
//举例说明
var intChan chan int
intChan = make(chan int, 3)
二:向channel中写入(存放)数据
//举例说明
var intChan chan int
intChan = make(chan int, 3)
num := 89
intChan <- 10
intChan <-num
三:向channel中取出(读取)数据
//举例说明
var intChan chan int
intChan = make(chan int, 3)
num := 89
intChan <- 10
intChan <-num
num2 := <-intChan
fmt.Println("num2=", num2)
注意细节:
- channel中只能存放指定的数据类型
- channel的数据放满后,就不能再放入了
- 如果从channel取出数据后,可以继续放入
- 在没有使用协程的情况下,如果channel数据取完了,再取,就会报
deadlock
完整案例:
package main
import "fmt"
func main() {
//1.创建一个可以存放3个int的channel
var intChan chan int
intChan = make(chan int, 3)
//2.查看intChan是什么
fmt.Printf("intChan 的值=%v,intChan 本身的地址=%v\n", intChan, &intChan)
//3.向管道写入数据
intChan <- 985
num := 211
intChan <- num
//4.查看管道的长度和cap【容量】 注意:给管道写入数据时,不能超过其容量
fmt.Printf("channel len=%v cap=%v\n", len(intChan), cap(intChan))
//5.从管道中取出数据
var num2 int
num2 = <-intChan
fmt.Println("num2=", num2)
fmt.Printf("channel len=%v cap=%v\n", len(intChan), cap(intChan))
//6.在没有使用协程的情况下,如果我们的管道数据已经全部取出,再取就会报告 deadlock
num3 := <-intChan //已经把管道数据取完了
num4 := <-intChan //deadlock!
fmt.Println("num3=", num3, "num4=", num4)
}
四:channel存放的数据类型【基本数据类型int、结构体、map等】
存放任意类型管道,案例如下:
package main
import "fmt"
type Cat struct {
Name string
Age int
}
func main() {
//定义一个存放任意类型的管道 格式:var allChan chan interface{}
allChan := make(chan interface{}, 3)
allChan <- 3
allChan <- "Carver cat"
cat := Cat{"狸花猫", 4}
allChan <- cat
//我们希望获取到管道中的第三个元素,则先将前2个推出
<-allChan
<-allChan
newCat := <-allChan //从管道中取出的猫
fmt.Printf("newCat=%T ,newCat=%v\n", newCat, newCat)
a := newCat.(Cat) //类型断言,因为最后的类型是未知的,存放的每一种类型只能在执行时获取,编译后还是一个接口类型
fmt.Printf("newCat.Name%v", a.Name)
}
本文来自博客园,作者:Carver大脸猫,转载请注明原文链接:https://www.cnblogs.com/carver/articles/18458454

浙公网安备 33010602011771号