golang语言的精髓就是它的并发机制,十分简单,而且极少数在语言层面实现并发机制的语言,golang被成为网络时代的c语言,golang的缔造者也有c语言的缔造者,Go语言是google程序员
推出的一门静态语言,自带方便的命令行工具,简洁的语法,虽然简洁可是足够强大,是编写高并发服务器理想的语言。golang
在goang中开启一个新的协程十分简单,使用go就能够开一个协程,每须要一个协程就用go开一个。服务器
固然其中有些细节须要注意。网络
因为go协程是并发的所以,在使用的时候要注意主协程结束的时候,是不会等待其余未完成的协程,因此,有关资源竞争就引出channel来解决资源竞争的问题,并发
屏幕的输出也是一种资源竞争所以在下面的练习代码中使用了打印字符的方式体现并发机制,和资源竞争。函数
go语言推行使通讯来实现资源竞争产生的混乱和丢失问题。高并发
1 package main 2 import “fmt” 3 4 func main() { 5 go func(){ 6 fmt.Println("协程一") 7 }() 8 go func(){ 9 fmt.Println("协程二") 10 }() 11 fmt.Println("结束") 12 } 13 这个例子只能输出“结束” 14 由于主协程已经结束运行了,并发协程来不及打印,主协程不会等待其余goroutine结束, 15 加入channel以后,就能够实现协程之间的通讯机制,感觉到golang的设计哲学。
一样是上面的例子,咱们经过加入chan类型的通讯消息变量解决上面程序的问题工具
1 var chani chan int 2 var chanj chan int 3 func main() { 4 go func() { 5 fmt.Println("协程一") 6 chani <- 1 7 chanj <-2 8 }() 9 10 11 go func() { 12 13 fmt.Println("协程二") 14 <-chani 15 close(chani) 16 }() 17 runtime.Gosched() //这个函数能够出让执行时间片,让别的协程执行 18 fmt.Println("结束") 19 }
channel是能够定义单向的消息ui
1 ch :=make(chan int) //建立一个双向的消息channel 2 3 var channel1 <-chan int =ch //只读 4 var channel2 chan<- int =ch //只写
定时器,也是经过channel来实现延时的过程google
1 func main() { 2 //计时器的使用 3 for i := 0; i < 10; i++ { 4 timer := time.NewTimer(2 * time.Second) 5 fmt.Println("如今时间:", time.Now()) 6 t := <-timer.C 7 fmt.Println(t, "\n", timer) 8 } 9 }
1 计时器是能够重置,和中止 2 timer.Stop() 3 timer.Reset()
在golang语言中有了channel,也引出了select
经过select语句能够监听channel上的数据流活动
select语句很像switch语句,由select语句
1 select{ 2 case <-chan1: 3 //若是chan1读到数据,则该case处理数据 4 case <-1: 5 //若是成功写入数据,则该case处理 6 default: 7 //默认
select语句有不少的限制条件的
每一个case语句必须是一个IO操做
若是任意一个可执行,选任意一个
若是没有default语句,没有知足case的时候,就会阻塞直到有case语句知足
用select实现斐波那契数列。(程序来源黑马程序员网络教程)
func fibonacci(ch chan<- int ,quit <-chan bool){ x,y :=1,1 for { //监听channel数据流动 select{ case ch<-x: x,y=y,x+y case flag:=<-quit: fmt.Println("flag=:",flag) return } } } func main(){ ch :=make(chan int) quit :=make(chan bool) go func(){ for i:=0;i<10;i++{ num:=<-ch fmt.Println(num) } quit<-true }() fibonacci(ch,quit) }