GO语言进阶与依赖管理(一)|青训营笔记

51 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天
一、本堂课重点内容:

  • GO语言进阶

二、详细知识点介绍:

  • GO语言进阶
    GO可以充分发挥多核优势,高效运行。 image.png 1.1 Goroutine

image.png

协程(goroutine):用户态,轻量级线程,栈KB级别
线程:内核态,一个线程中有多个协程,栈MB级别

Go 语言支持并发,我们只需要通过 go 关键字来开启 goroutine 即可。

goroutine 是轻量级线程,goroutine 的调度是由 Golang 运行时进行管理的。

goroutine 语法格式:

go 函数名( 参数列表 )

例如:

go f(x, y, z)

开启一个新的 goroutine:

f(x, y, z)

Go 允许使用 go 语句开启一个新的运行期线程, 即 goroutine,以一个不同的、新创建的 goroutine 来执行一个函数。 同一个程序中的所有 goroutine 共享同一个地址空间。
例子:

func hello(i int){
    println("hello goroutine:"+fmt.Sprint(i))
}

func HelloGoRoutine(){
    for i:=0;i<5;i++{
        go func(j int){//使用go关键字创建协程
        hello(j)
        }(i)
    }
    time.Sleep(time.Second)
}
//结果:
//hello goroutine:4
//hello goroutine:1
//hello goroutine:0
//hello goroutine:2
//hello goroutine:3

可以看到没有固定的输出先后顺序,因为它们是由不同的goroutine在执行。 1.2 CSP(Communicating Sequential Processes)

image.png

提倡通过通信共享内存而不是通过共享内存而实现通信。
1.3 Channel
通道(channel)是用来传递数据的一个数据结构。

image.png

通道可用于两个 goroutine 之间通过传递一个指定类型的值来同步运行和通讯。操作符 <- 用于指定通道的方向,发送或接收。如果未指定方向,则为双向通道。

ch <- v    // 把 v 发送到通道 ch
v := <-ch  // 从 ch 接收数据
           // 并把值赋给 v

声明一个通道很简单,我们使用chan关键字即可,通道在使用前必须先创建:

ch := make(chan int)

注意:默认情况下,通道是不带缓冲区的。发送端发送数据,同时必须有接收端相应的接收数据。

通道由带不带缓冲区分为有缓冲通道和无缓冲通道,无缓冲通道也被称为同步通道。

三、引用参考: