Go语言进阶 | 青训营

86 阅读2分钟

以下笔记内容来自于走进go语言基础语法课程-Go语言进阶与依赖管理一课 #青训营笔记创作活动

一、语言进阶

1.1并发&并行-Goroutine

并行是在多核计算机上面运行并发程序,go语言作为多线程程序可以充分发挥多核计算机的优势,高效运行。

协程: 用户态,轻量级线程,栈 (KB 级别),go语言可以做到上万个协程,因此更适合处理并发事务。

线程: 内核态,线程跑多个协程,栈 (MB 级别)

Go 中提供了个关键字 go 来让我们创建一个 Go 协程,当我们在函数或方法的调用之前添加个关键字 go ,这样我们就开启了一个 Go 协程,该函数或者方法就会在这个 Go 协程中运行。

下面是快速打印4次"hello goroutine:n"这句话,使用到并发编程,为什么不直接打印4次呢,因为直接打印4次是串行打印,不能满足快速的要求,从这个例子我们也可以看出Go处理并发的操作是十分简单快捷的。 只要在需要并发执行的函数前面加上go关键字即可使用协程运行

func hello(i int) { 
    println("hello goroutine : n + fmt.Sprint(i))
}
func HelloGoRoutine() {
    for i:= 0;i< 5;i++ {
        go func(j int) {
            hello(j)
        }(i)
    }
    time.Sleep(time.Second)
}

在默认情况下,每个独立的 Go 应用运行时就创建了一个 Go 协程,其 main 函数就在这个 Go协程中运行,这个 Go 协程就被称为 go 主协程(main Goroutine,下面简称主协程) 。

二、通信机制

2.1 csp 通信顺序进程

提倡通过通信共享内存而不是通过共享内存而实现通信,需要加锁实现。

2.2 Channel

使用方法:

make(chan 元素类型,[缓冲大小])

无缓冲通道 make(chan int)

有缓冲通道 make(chan int,n) n为缓冲数量

以以下这段代码为例,通过通信实现共享内存。

func CalSquare(){
    src := make(chan int)    //无缓冲队列
    dest := make(chan int,3) //有缓冲队列
    //A子协程,发送0~9数字
    go func (){
        defer close(src)
        for i := 0;i<10;i+ {
            src<-i
        }
    }()
    //B子协程,计算输入数字的平方
    go func() {
    defer close(dest)for i := range src {
            dest <-i*i
        }
    }()
    //主协程输出最后的平方数
    for i := range dest {
        //省略复杂操作
        printin(i)
    }
 }