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
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
转载请注明原处
本文来自博客园,作者:Carver-大脸猫,转载请注明原文链接:https://www.cnblogs.com/carver/articles/18458454
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现