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)

注意细节:

  1. channel中只能存放指定的数据类型
  2. channel的数据放满后,就不能再放入了
  3. 如果从channel取出数据后,可以继续放入
  4. 在没有使用协程的情况下,如果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 国际」许可协议进行许可。

转载请注明原处

posted @   Carver-大脸猫  阅读(6)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示
more_horiz
keyboard_arrow_up light_mode palette
选择主题