Learn Golang in Days - Day 16-Go并发

栏目: Go · 发布时间: 7年前

Learn Golang in Days - Day 16-Go并发

简介

  • go语言支持并发,只需要使用 go 关键字开启goroutine即可。
  • goroutine是轻量级现场,goroutine由运行时进行调度管理
package main

import "fmt"
import "time"

func say(s string) {
    for i := 0; i < 5; i++ {
        time.Sleep(100 * time.Millisecond)
        fmt.Println(s)
    }
}

func main() {
    go say("world")
    say("hello")
}

通道channel

<-
ch <- v //v 发送到通道ch
v := <- ch //从通道ch接收数据,并赋值给v
  • 声明通道
  • 默认情况下,通道是不带缓冲区的。
ch := make(chan int)
  • 例子
package main

import (
    "fmt"
)

// 求和
func sum(s []int, c chan int) {
    sum := 0
    fmt.Printf("0***********\n")
    fmt.Println(s)
    for _, v := range s {
        fmt.Printf("%d\t",v)
        sum += v
    }
    c <- sum
    fmt.Printf("\n1***********\n")
}

func main() {
    // 初始化切片
    s := []int{61,2123,123,55,66,7,7,8,88,9,990,4343,2342, 7, 3, 4, 5, 8}

    // 创建通道
    c := make(chan int)

    //启动两个协程
    go sum(s[:len(s)/2], c)
    go sum(s[len(s)/2:], c)

    // 从通道中接收
    x, y := <-c, <-c

    fmt.Println("\n---------------------")
    fmt.Println(x, y, x+y)
}

遍历通道与关闭通道

  • Go通过range关键字来遍历读取通道的数据,类似于数组与切片

    v, ok := <- ch

package main

import "fmt"
import "time"

func main() {
    c := make(chan int, 10)
    go fibonacci(cap(c), c)

    //遍历
    for i := range c {
        fmt.Println(i)
    }

}

//斐波那契数列
func fibonacci(n int, c chan int) {
    x, y := 0, 1
    for i := 0; i < n; i++ {
        fmt.Println(time.Now())
        time.Sleep(3 * time.Second)
        // x 发送给通道c
        c <- x
        x, y = y, x+y
    }
    close(c)
}

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Java语言精粹

Java语言精粹

Jim Waldo / 王江平 / 电子工业出版社 / 2011-6 / 39.00元

这是一本几乎只讲java优点的书。 Jim Waldo先生是原sun微系统公司实验室的杰出工程师,他亲历并参与了java从技术萌生、发展到崛起的整个过程。在这《java语言精粹》里,jim总结了他所认为的java语言及其环境的诸多精良部分,包括:类型系统、异常处理、包机制、垃圾回收、java虚拟机、javadoc、集合、远程方法调用和并发机制。另外,他还从开发者的角度分析了在java技术周围......一起来看看 《Java语言精粹》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具