Golang-channel01

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

管道

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)

}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值