管道
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)
}
本文介绍了Go语言中的管道(channel)概念,强调其作为线程安全的队列,实现数据同步和通信的核心作用。文中通过实例展示了如何声明、初始化channel,以及如何进行数据的读写操作。此外,还探讨了channel的类型限制和容量设定,并提供了一个存放任意类型数据的channel示例。最后,提到了类型断言在从channel中取出数据时的应用。

被折叠的 条评论
为什么被折叠?



