go语言青训营总结六(Goroutine 2) |青训营

48 阅读2分钟

前序

今天继续总结的是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函数创建一个新的管道,其中可选参数指定了管道的缓冲大小。对于无缓冲管道,发送和接收操作将会在发送和接收者都准备好后才会完成;而对于有缓冲管道,则可以存储一定量的数据,直到缓冲区满或空为止。