前序
今天继续总结的是go语言的多线程知识:go协程(goroutine)。
如何使用Goroutine
在函数或方法调用前面加上关键字go,您将会同时运行一个新的Goroutine。
package main
import (
"fmt"
)
func hello() {
fmt.Println("Hello world goroutine")
}
func main() {
go hello()
fmt.Println("main function")
}
协程跟线程一样,运行是没有先后顺序的,任何打印结果都是有可能的。
管道(Channel)
Go语言的管道(Channel)是一种用于在多个goroutine之间进行通信和同步的原语。它可以让一个goroutine发送消息到另一个goroutine,也可以让两个goroutine在某个时间点阻塞等待彼此。
管道的本质
- Channel的本质是一个队列
- Channel是线程安全的, 也就是自带锁定功能
- Channel声明和初始化
-
- 声明:
var 变量名chan 数据类型 - 初始化:
mych := make(chan 数据类型, 容量) - 通过
<-,->来传递数据 - Channel和切片还有字典一样, 必须make之后才能使用
- Channel和切片还有字典一样, 是引用类型
- 声明:
package main
import "fmt"
func main() {
// 1.声明一个管道
var mych chan int
// 2.初始化一个管道
mych = make(chan int, 3)
// 3.查看管道的长度和容量
fmt.Println("长度是", len(mych), "容量是", cap(mych))
// 4.像管道中写入数据
mych<- 666
fmt.Println("长度是", len(mych), "容量是", cap(mych))
// 5.取出管道中写入的数据
num := <-mych
fmt.Println("num = ", num)
fmt.Println("长度是", len(mych), "容量是", cap(mych))
}
管道是安全的、同步的,并且可以在不同goroutine之间传递任意类型的数据。使用管道时,需要通过make函数创建一个新的管道,其中可选参数指定了管道的缓冲大小。对于无缓冲管道,发送和接收操作将会在发送和接收者都准备好后才会完成;而对于有缓冲管道,则可以存储一定量的数据,直到缓冲区满或空为止。