为什么80%的码农都做不了架构师?>>>   

1、Reader

io 包指定了 io.Reader 接口,它表示从数据流的末尾进行读取。

Reader接口包含的方法

func (T) Read(b []byte) (n int, err error)

Read 用数据填充给定的字节切片并返回填充的字节数和错误值。在遇到数据流的结尾时,它会返回一个 io.EOF 错误,如下:

package mainimport ("strings""fmt""io"
)func main()  {//创建字符串mujiutianr:= strings.NewReader("mujiutian!")//创建byte类型的切片,长度为8b:= make([]byte,8)//循环遍历,直到遇到数据流的结尾时,他会返回一个io.EOF错误for {n,err := r.Read(b)fmt.Printf("n= %v err = %v b= %v \n",n,err,b)if err == io.EOF {break}}
}

结果:

n= 8 err = <nil> b= [109 117 106 105 117 116 105 97]
n= 2 err = <nil> b= [110 33 106 105 117 116 105 97]
n= 0 err = EOF b= [110 33 106 105 117 116 105 97]

第一次读取了8个字节数【mujiutia】,第二次数据了两个字节数【n!】,最后0个。

2、go并发,goroutine

package mainimport ("time""fmt"
)func say(s string) {for i := 0; i < 5; i++ {time.Sleep(10 * time.Millisecond)fmt.Println(s)}
}func main() {go say("osc")say("mujiutian")
}

结果,这个结果也是随机的:

mujiutian
osc
osc
mujiutian
osc
mujiutian
osc
mujiutian
osc
mujiutian

从随机的结果也可以看到,这是两个单独的线程在执行,不然一个线程的话会有先后顺序,有截图如下:

2、信道chan

2.1 信道是带有类型的管道,你可以通过它用信道操作符 <- 来发送或者接收值。

2.2 “箭头”就是数据流的方向。

2.3 和映射与切片一样,信道在使用前必须创建。

package mainimport "fmt"func sum(s []int, c chan int) {sum := 0for _, v := range s {sum += v}c <- sum // 将和送入 c
}func main() {s := []int{8, 2, 8, -9, 4, 0}c := make(chan int)d := make(chan int)go sum(s[:len(s)/2], c)go sum(s[len(s)/2:], d)x, y := <-d, <-c // 从 c 中接收fmt.Println(x, y, x+y)
}

结果为:-5 18 13

3、带缓冲的chan,固定长度

仅当信道的缓冲区填满后,向其发送数据时才会阻塞。当缓冲区为空时,接受方会阻塞。

这句话的意思就是如果发送数据的长度大于接收数据信道的长度,会发生阻塞,同样,当发送数据为信道时,而它为空,也出现阻塞,简单理解就是报错。

import "fmt"func main() {ch := make(chan int, 1)ch <- 1fmt.Println(<-ch)
}

现在是一个长度的信道,结果为:1

现在变成两个,发送数据大于信道长度,如下:

package mainimport "fmt"func main() {ch := make(chan int, 1)ch <- 1ch <- 8fmt.Println(<-ch)fmt.Println(<-ch)
}

结果报错:

当信道为空时,作为发送数据一方也同样会报错,如下:

func main() {ch := make(chan int, 1)fmt.Println(<-ch)
}

4、range 和 close

发送者可通过 close 关闭一个信道来表示没有需要发送的值了。接收者可以通过为接收表达式分配第二个参数来测试信道是否被关闭:若没有值可以接收且信道已被关闭,那么在执行完

v, ok := <-ch

之后 ok 会被设置为false,也就是信道关闭的意思

只有发送者才能关闭信道,而接收者不能。

向一个已经关闭的信道发送数据会引发程序恐慌(panic)信道与文件不同,通常情况下无需关闭它们。只有在必须告诉接收者不再有值需要发送的时候才有必要关闭,例如终止一个 range 循环

package mainimport "fmt"func fibonacci(n int, c chan int) {x, y := 0, 1for i := 0; i < n; i++ {c <- xx, y = y, x+y}close(c)
}func main() {c := make(chan int, 10)go fibonacci(cap(c), c)for i := range c {fmt.Println(i)}
}

5、select语句

package mainimport "fmt"func fibonacci(c, quit chan int) {x, y := 0, 1for {select {case c <- x:x, y = y, x+ycase <-quit:fmt.Println("quit")return}}
}func main() {c := make(chan int)quit := make(chan int)go func() {for i := 0; i < 10; i++ {fmt.Println(<-c)}quit <- 0}()fibonacci(c, quit)
}

结果为:

0
1
1
2
3
5
8
13
21
34
quit

select 语句使一个 Go 程可以等待多个通信操作。就是通信线操作,go成后执行。

当 select 中的其它分支都没有准备好时,default 分支就会执行。和java的switch中的default一样。

转载于:https://my.oschina.net/mdxlcj/blog/1941625

Go语言_通神路五耀篇(3)相关推荐

  1. Go语言_通神路之灵胎篇(5)

    为什么80%的码农都做不了架构师?>>>    1.指针 Go 拥有指针.指针保存了值的内存地址 类型 *T 是指向 T 类型值的指针.其零值为 nil. & 操作符会生成一 ...

  2. Go语言_通神路之灵胎篇(3)

    为什么80%的码农都做不了架构师?>>>    1.变量 go的变量和java变量差不多,也分局部作用域和全部作用域 package mainimport "fmt&quo ...

  3. Go语言_通神路之灵胎篇(1)

    为什么80%的码农都做不了架构师?>>>    序言:Go语言拿下两届年度最佳编程语言,区块链目前最火使用的编程语言,2020年-2025年爆发年!go的开源项目:docker.ku ...

  4. Go语言_通神路之灵胎篇(2)

    为什么80%的码农都做不了架构师?>>>    1.包 每个Go程序都是由包构成,从main包开始运行,就是我上一篇讲到的,都是从main函数开始执行,但是必须在main包下面! p ...

  5. Go语言_通神路之灵胎篇(4)

    为什么80%的码农都做不了架构师?>>>    1.for循环 func main() {sum := 0for i := 0;i<10 ;i++ {sum += i}fmt. ...

  6. Go语言_通神路之灵胎篇(6)

    为什么80%的码农都做不了架构师?>>>    1.映射 1.1 概念 go的映射在java中被叫做集合 type Vertex struct {Lat, Long float64 ...

  7. CSharp(C#)语言_第五章(类和继承)

    类和继承 5.1 类继承 5.2 访问继承的成员 5.3 所有类都派生自object类 5.4 隐藏基类成员 5.5 基类访问 5.6 使用基类的引用 5.6.1 虚方法和覆写方法 5.6.2 覆写标 ...

  8. C++语言程序设计视频教程_清华大学_郑莉(基础篇+进阶篇)

    C++语言程序设计视频教程_清华大学_郑莉(基础篇) 第一章:绪论 1.1 导学 1.2 计算机系统简介 1.3计算机语言和程序设计方法的发展 1.4 面向对象的基本概念 1.5 程序的开发过程 1. ...

  9. c语言拍飞虫课程设计报告,c语言课程设计_拍飞虫提高篇.doc

    c语言课程设计_拍飞虫提高篇 C语言课程设计二 拍飞虫 一.游戏介绍 拍飞虫游戏是玩家用鼠标控制拍子,拍飞虫.飞虫每次从不同的位置.以不同的速度飞来飞去.玩家拍的飞虫越多,分数越高. 二.实验目的 综 ...

最新文章

  1. SVN客户端不显示绿色标识
  2. angular中的class写三元表达式 和 清空表单校验
  3. 如何使用vscode安装和调试Java程序
  4. @@IDENTITY 的缺点 SCOPE_IDENTITY() 取而代之
  5. Java多线程 ——线程基础和锁锁锁
  6. 交叉调试 arm linux,搭建交叉调试环境Arm-Linux-Gdb与gdbserver
  7. linux内核全局变量同名,Linux系统下DSO同名全局变量浅析
  8. unity案例 mysql lua_通过Xlua实现unity热更新的一个小例子
  9. Python机器学习:SVM008SVM思想解决回归问题
  10. python selenium list index out of range
  11. python import出错_python – ImportError:无法导入名称’app’
  12. html a 的写法,HTML超链接a标记CSS样式写法示例
  13. 训练集、测试集和验证集的作用
  14. jQuery Mobile的学习时间botton按钮的事件学习
  15. java插入图片_如何在java窗体程序中添加图片
  16. Rinne Loves Dynamic Graph
  17. Elasticsearch数据库all shards failed
  18. linux挂载img镜像文件,如何挂载.img格式的镜像
  19. 英语高考计算机阅读答案解析,2021考研英语一阅读理解试题及答案解析(中公考研版)...
  20. [CF796E Round#408 Div.2]Exam Cheating——[计数DP]

热门文章

  1. Mac下修改ZOC中文乱码
  2. asp.net网站中CrystalReport的简单应用
  3. 解决TM2008的界面字体问题
  4. 编程游戏python我的世界_乐学Python编程-做个游戏很简单
  5. php 跨域读php_php跨域的几种方式
  6. 北斗导航 | RAIM:改进的最优加权平均解(IOWAS)算法(接收机自主完好性监测)
  7. Python练习 | Python中的运算符
  8. VC导入导出二维数组到 .txt
  9. mysql驱动为什么自动加载_为什么JDBC中加载驱动要使用反射?
  10. dtm文件生成等高线 lisp_DEM、DSM和DTM的区别