美文网首页
跟我一起学习GO语言008

跟我一起学习GO语言008

作者: 搬砖人1314 | 来源:发表于2019-08-07 17:57 被阅读0次

      本节我们来看GO语言中的并发
      我们看并发,就不得不学习goroutine,goroutine是Go语言并行设计的核心。goroutine说到底就是线程,但是它比现场更小,几十个goroutine可能体现就是五六个线程,Go语言内部帮我们实现了这些goroutine之间的内存共享。
   goroutine是通过Go语言rutime管理的一个线程管理。goroutine通过go关键字实现了,其实就是一个普通函数。

例子01

package main
import (
       "fmt"
       "rutime"
)

func say(s string){
       for i:=0;i<5;i++{
              runtime.Gosched()
              fmt.Println(s)
       }
}

func main(){
       go say("world")//开一个新的Goroutines执行
       say("hello")//当前Goroutines执行
}

输出:
hello
world
hello
world
hello
world
hello
world
hello
world

   Go语言提供了一个很好的通信机制channel。它就是goroutine运行在相同地址空间,访问时需要做好同步,之间进行数据通信的。channel可以与Unix shell中的双向管道做类比,通过它发送或者接收值。

创建channel时注意:必须使用make.
ci:=make(chan int)
ci:=make(chan string)
cf:=make(chan interface{})
channel通过操作符<-来接收和发送数据。
ch<-v //发送V到channel ch.
v:=<-ch //从ch中接收数据,并赋值给V

例子02
package main

func sum(a []int,c chan int){
       sum:=0
       for _,v:=range a{
       sum+=v
       }
       c<-sum
}

func main(){

       a:=[] int{7,2,8,-9,4,0}
       c:=make(chan int)
       go sum(a[:len(a)/2],c)
       go sum(a[len(a)/2:],c)
       x,y:=-c,<-c
       fmt.Println(x,y,x+y)
}

     上面介绍的只有一个channel的情况,如果存在多个channel,我们该如何操作呢?Go语言中提供了一个关键字select,通过select可以监控channel上的数据流动。

例子03

package main
import "fmt"

func fibonacci(c,quit chan int){
       s,y:=1,1
       for{
       select{
       case c<-x:
              x,y=y,x+y
       case<-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)

}

请开始你的表演,践行,践行,再践行。未完待续。。。

相关文章

  • 跟我一起学习GO语言008

    本节我们来看GO语言中的并发。 我们看并发,就不得不学习goroutine,goroutine是Go语言...

  • 跟我一起学习GO语言004

    接上一节继续学习Go语言,存储和组织数据的方式 首先我们来学习数组,数组是一段固定长度的连续内存区域。 数组声明:...

  • 跟我一起学习GO语言007

    接上节,获得可变参数类型,可变参数为interface{}类型时,可以传入任何类型的值。 func printTy...

  • 跟我一起学习GO语言009

    本节我们做Go语言的一些语法回顾,通过语法我们可以发现Go语言非常简单,只有25个关键字,接下来我们回顾一下关键...

  • 跟我一起学习GO语言-小结

    学习GO语言有一段时间了,也写了不少的章节,因时间有点长了,所以我们对前面所学的知识做一下小结,然后作为一个目录,...

  • 跟我一起学习GO语言003

    接上一节继续学习Go基本语法与使用-字符串应用 通过Go语言内建函数获取切片、字符串、通道等长度。 例如-01: ...

  • 跟我一起学习GO语言006

    接下来我们看函数,这个是各种语言中重要的组成部分 func 函数名(参数列表)(返回参数列表){ 函数内容} 来...

  • 跟我一起学习GO语言005

    接上一节继续学习Go语言,存储和组织数据的方式 首先我们来看看列表增删方法 初始化列表:变量名:=list.New...

  • Go 语言学习技巧和编程思维

    Go 语言学习技巧和编程思维 一、了解 Go 语言 了解 Go 语言背景 学习 Go 语言,首先要了解 Go 语言...

  • 跟我一起学习GO语言012——表单操作

    上一节我们介绍了搭建一个Web服务器,本节我们来看看通过表单让客户端和服务器方便的进行数据交互,首先我们来看看一...

网友评论

      本文标题:跟我一起学习GO语言008

      本文链接:https://www.haomeiwen.com/subject/tzfpdctx.html