go学习 --- 管道

一、管道

1、channle本质就是--个数据结构-队列

2、数据是先进先出[FIFO: first in first out]

3、线程安全,多goroutine访 问时,不需要加锁,就是说channel本 身就是线程安全的

4、channel时有类型的,一个string的channel只能存放string类型数据。

二、管道的使用

package main

import "fmt"

func main() {
	//创建一个管道
	intChan := make(chan int, 3)
	//管道的类型
	fmt.Printf("intChan的值:%v\n",intChan)
	//向管道写入数据
	intChan<- 10
	num := 100
	intChan<- num
	//管道的容量与长度
	fmt.Printf("管道的长度为:%v 容量为:%v\n",len(intChan),cap(intChan))
    //从管道中读取数据
    num2 := <-intChan
    fmt.Println(num2)
    //当管道中的数据没有在取会报错
	num3 := <-intChan
	num4 := <-intChan
	fmt.Println(num3,num4)

}

 三、注意事项

1、channel中只能存放指定的数据类型。

2、channle的数据放满后,就不能再放入了

3、如果从channel取出数据后,可以继续放入

4、在没有使用协程的情况下,如果channel数据取完了,再取,就会报dead lock

四、管道存放数据类型

1、map类型

package main

import "fmt"

func main() {
	//定义一个map类型的管道
	mapChan := make(chan map[string]string, 10)
	map1 := make(map[string]string, 10)
	map1["name"] = "老王"
	map1["age"] = "25"
	mapChan<- map1
	fmt.Println(len(mapChan))
	//取出map
	<-mapChan
	fmt.Println(len(mapChan))
}

2、结构体

package main
//定义一个结构体
type Cat struct {
	Name string
	Age int
} 
func main() {
	catChan := make(chan Cat, 10)
	//存入数据
	catChan<- Cat{"小白",1}
	catChan<- Cat{"小黑",2}
	//取出数据
	<-catChan
	<-catChan
}

3、指针类型

package main
//定义一个结构体
type Cat struct {
	Name string
	Age int
}
func main() {
	catChan := make(chan *Cat, 10)
	//存入数据
	catChan<- &Cat{"小白",1}
	catChan<- &Cat{"小黑",2}
	//取出数据
	<-catChan
	<-catChan
}

4、存放不同数据类型

package main
//定义一个结构体
type Cat struct {
	Name string
	Age int
}
func main() {
	catChan := make(chan interface{}, 10)
	//存入数据
	catChan<- &Cat{"小白",1}
	catChan<- &Cat{"小黑",2}
	catChan<- "老王"
	catChan<- 18
	//取出数据
	<-catChan
	<-catChan
}

五、关闭管道

package main

import "fmt"

func main() {
	intChan := make(chan int, 3)
	intChan<- 1
	intChan<- 2
	//关闭管道
	close(intChan)
	//关闭后不能在写数据
	//intChan<- 3
	fmt.Println(len(intChan))
	//可以读取数据
	num := <-intChan
	fmt.Println(num)
}

六、遍历管道

package main

import "fmt"

func main() {
	intChan := make(chan int, 50)
	for i:=1;i<=50 ;i++  {
		intChan<- i
	}
	//关闭管道
	close(intChan)
	//关闭后不能在写数据
	//intChan<- 3
	fmt.Println(len(intChan))
	//遍历管道
	for  value := range intChan {
		fmt.Println(value)
	}

}

 七、练习一

package main

import (
	"fmt"
	"math/rand"
	"strconv"
	"time"
)

type Person struct {
	Name string
	Age int
	Address string
}
func main() {
	//创建一个管道
	channel := make(chan Person, 10)
	rand.Seed(time.Now().UnixNano())
	//创建10个结构体
  	for i :=1;i <=10;i++{
  		a := rand.Intn(50)+1
		person := Person{"老王"+strconv.Itoa(a), a, "北京"+strconv.Itoa(a)}
		channel<- person
	}
	//这里需要关闭
	close(channel)
	for value := range channel {
		fmt.Println(value)
	}

}

 练习二

package main

import "fmt"

//写入协程
func writeData(intChan chan int)  {
	//向管道中写入数据
	for i:=1;i<=50 ;i++  {
		intChan<- i
	}
	//关闭管道
	close(intChan)
}
//读取协程
func ReadData(intChan chan int,boolChan chan bool)  {
	for  {
		v , ok := <-intChan
		if !ok {
			break
		}
		//打印读取的数据
		fmt.Println(v)
	}
	boolChan<- true
	close(boolChan)
}
func main() {
	//创建管道
	intChan := make(chan int, 50)
	boolChan := make(chan bool, 1)
	//开启协程
	go writeData(intChan)
	go ReadData(intChan,boolChan)
	for {
		_,ok :=<-boolChan
		if !ok{
			break
		}
	}
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鸭鸭老板

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值