这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天
一、本堂课重点内容:
- GO语言进阶
二、详细知识点介绍:
- GO语言进阶
GO可以充分发挥多核优势,高效运行。1.1 Goroutine
协程(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)
提倡通过通信共享内存而不是通过共享内存而实现通信。
1.3 Channel
通道(channel)是用来传递数据的一个数据结构。
通道可用于两个 goroutine 之间通过传递一个指定类型的值来同步运行和通讯。操作符 <- 用于指定通道的方向,发送或接收。如果未指定方向,则为双向通道。
ch <- v // 把 v 发送到通道 ch
v := <-ch // 从 ch 接收数据
// 并把值赋给 v
声明一个通道很简单,我们使用chan关键字即可,通道在使用前必须先创建:
ch := make(chan int)
注意:默认情况下,通道是不带缓冲区的。发送端发送数据,同时必须有接收端相应的接收数据。
通道由带不带缓冲区分为有缓冲通道和无缓冲通道,无缓冲通道也被称为同步通道。
三、引用参考: