教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 go语言管道总结

go语言管道总结

发布时间:2022-02-27   编辑:jiaochengji.com
教程集为您提供go语言管道总结等资源,欢迎您收藏本站,我们将为您提供最新的go语言管道总结资源
<h1>                                     go语言管道总结</h1>

<h3>一、channel 的基本介绍</h3>

<ul><li>channle 本质就是一个数据结构-队列</li><li>数据是先进先出【FIFO : first in first out】</li><li>线程安全,多 goroutine 访问时,不需要加锁,就是说 channel 本身就是线程安全的</li><li>channel 有类型的,一个 string 的 channel 只能存放 string 类型数据。</li><li>示意图:</li></ul>

<h3>二、定义和声明</h3>

<pre><code>package main import ( "fmt" ) func main() { //演示一下管道的使用 //1. 创建一个可以存放 3 个 int 类型的管道 var intChan chan int intChan = make(chan int, 3) //2. 看看 intChan 是什么 fmt.Printf("intChan 的值=%v intChan 本身的地址=%p\n", intChan, &intChan) //3. 向管道写入数据 intChan<- 10 num := 211 intChan<- num intChan<- 50 // intChan<- 98//注意点, 当我们给管写入数据时,不能超过其容量 //4. 看看管道的长度和 cap(容量) fmt.Printf("channel len= %v cap=%v \n", len(intChan), cap(intChan)) // 3, 3 }</code></pre>

<h3>三、channel 使用的注意事项</h3>

<ul><li>channel 中只能存放指定的数据类型</li><li>channle 的数据放满后,就不能再放入了</li><li>如果从 channel 取出数据后,可以继续放入</li><li>在没有使用协程的情况下,如果 channel 数据取完了,再取,就会报 dead lock</li><li>当管道的类型为任意类型时,从管道获取出来的值必须经过类型断言才能操作或者参与运算</li></ul>

 

<h3>四、channel 的遍历</h3>

<ul><li>channel 支持 for--range 的方式进行遍历,请注意两个细节</li><li>1) 在遍历时,如果 channel 没有关闭,则会出现 deadlock 的错误</li><li>2) 在遍历时,如果 channel 已经关闭,则会正常遍历数据,遍历完后,就会退出遍历。</li><li>演示:</li></ul><pre><code>func main() { var intChan chan int intChan = make(chan int,100) for i := 0; i < 100; i { intChan <- i } //如果不关闭则会deadlock close(intChan) for v := range intChan{ fmt.Println(v) } }</code></pre>

<h3>五、channel 使用细节和注意事项</h3>

<ul><li>channel 可以声明为只读,或者只写性质。</li></ul><pre><code> //只写 var Chan chan<- int64 Chan = make(chan int64, 2) Chan <- 5 num := <-Chan //报错 fmt.Println(num) //只读 var Chan2 <-chan int64 Chan2 <- 2 //报错 fmt.Println(Chan2)</code></pre>

<ul><li>使用 select 可以解决从管道取数据的阻塞问题实例</li></ul><pre><code>package main import ( "fmt" "time" ) func main() { //使用 select 可以解决从管道取数据的阻塞问题 //1.定义一个管道 10 个数据 int intChan := make(chan int, 10) for i := 0; i < 10; i { intChan<- i } //2.定义一个管道 5 个数据 string stringChan := make(chan string, 5) for i := 0; i < 5; i { stringChan <- "hello" fmt.Sprintf("%d", i) } //传统的方法在遍历管道时,如果不关闭会阻塞而导致 deadlock //在实际开发中,可能我们不好确定什么关闭该管道. 可以使用 select 方式可以解决 for { select { //会自动到下一个 case 匹配 case v := <-intChan : fmt.Printf("从 intChan 读取的数据%d\n", v) time.Sleep(time.Second) case v := <-stringChan : fmt.Printf("从 stringChan 读取的数据%s\n", v) time.Sleep(time.Second) default : fmt.Printf("都取不到了,可以加入逻辑\n") time.Sleep(time.Second) return } } }</code></pre>

 

 

 

 

到此这篇关于“go语言管道总结”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
初识 Go 语言
从零开始学习GO语言-搭建Go语言开发环境-快速开发入门第一个小程序
Go 语言到底适合干什么?
2018年最全Go语言教程零基础入门到进阶实战视频
Go语言爱好者周刊:第 78 期 — 这道关于 goroutine 的题
Go语言的主要特性和发展影响
[GO语言基础] 一.为什么我要学习Golang以及GO语言入门普及
Go 1.5之前的多种包管理机制简介(
兄弟连golang神技(1)-关于 Go 语言的介绍
Go 语言十年而立,Go2 蓄势待发

[关闭]
~ ~