Golang-channel01

    科技2025-05-18  7

    管道

    1.管道本质是队列,先进先出 2.管道是线程安全的,多个协程操作同一个管道时不会发生资源竞争问题 3.channel有类型的,一个string的管道只能放string类型的数据

    基本使用

    声明/定义 channel: var 变量名 chan 数据类型 如: var intChan chan int var mapChan chan map[int]string var poicChan chan *Person 注意: 1)管道时引用类型 2)管道必须初始化(make)之后才能写入数据

    入门演示

    package main import( "fmt" ) func main(){ var intChan chan int //容量为3的int类型的channel intChan = make(chan int, 3) fmt.Printf("intChan is %T\n",intChan) fmt.Printf("intChan 的值 %v\n", intChan) //channel时引用类型 fmt.Printf("intChan 本身的地址的值 %p\n", &intChan) //1.向管道写入数据 intChan <- 10 num := 211 intChan <- num //2.看管道的长度与容量 fmt.Printf("intChan 的长度 %v, 容量 %v\n", len(intChan), cap(intChan)) //3.取出数据 num2 := <-intChan fmt.Printf("num2 is %v\n", num2) fmt.Printf("intChan 的长度 %v, 容量 %v\n", len(intChan), cap(intChan)) }

    注意: 1.channel的一旦设定不会改变,但可以出队入队改变长度,先入先出,一边放一边取。 2.取数据可以用<-intChan,可以不用写接收对象,取出丢弃。 3.创建一个allChan,最多可以放10个任意类型,用空接口interface{} 演示代码如下:

    package main import ( "fmt" ) type Cat struct{ Name string Age int } func main(){ //定义一个存放任意类型数据的管道 //var allChan chan interface{} allChan := make(chan interface{}, 5) allChan <-10 allChan <-"steven jobs" cat := Cat{"小花猫", 5} allChan <- cat <-allChan <-allChan newChat :=<-allChan fmt.Println(newChat) //编译不通过 //fmt.Printf("newChat.Name = %v", newChat.Name) a := newChat.(Cat) //知识点类型断言 fmt.Printf("newChat.Name = %v", a.Name) }
    Processed: 0.009, SQL: 8