Golang基础笔记十之goroutine和channel

本文首发于公众号:Hunter后端

原文链接:Golang基础笔记十之goroutine和channel

这一篇介绍 Golang 里的 goroutine 和 channel 通道。

以下是本篇笔记目录:

  1. goroutine
  2. channel
  3. goroutine 与 channel 的使用

1、goroutine

goroutine 是一种轻量级线程(用户态线程),由 Go 运行时管理而非操作系统,它是 Go 并发模型的核心,能高效处理大量并发任务。

1. goroutine 的使用

goroutine 的使用非常简单,直接使用 go + 函数 即可启动一个 goroutine:

package main

import (
	"fmt"
	"time"
)

func PrintGoroutineInfo() {
   
   
    fmt.Println("msg from goroutine")
}

func main() {
   
   
    go PrintGoroutineInfo()
    time.Sleep(1 * time.Millisecond)
    fmt.Println("msg from main")
}
2. 匿名函数使用 goroutine
func main() {
   
   
    go func() {
   
   
        fmt.Println("msg from goroutine")
    }()
    time.Sleep(1 * time.Second)
}

而如果 goroutine 运行的函数有返回值,想要获取函数的返回值应该如何操作呢?

或者当我们使用 goroutine 的时候,如何使主 goroutine 等待并发的 goroutine 执行完毕再接着往后执行呢?

其中一个方法就是使用 channel 来获取返回值,以及使用 channel 的阻塞状态来等待并发的 goroutine 执行完毕。

2、channel

channel,即通道,可用于在 goroutine 之间传递数据和同步状态。

1. channel 的声明与创建

channel 是强类型的,每个 channel 只能传递一种类型的数据。

1) 无缓冲通道

比如我们声明一个传递 int 类型的 channel:

var ch chan int

或者直接创建一个传递 int 数据的通道:

ch := make(chan int)
2) 有缓冲通道

在创建 channel 的时候,如果不指定容量,那么则称其为无缓冲通道,如果指定了容量,则为有缓冲通道,比如下面创建一个容量为 3 的通道:

ch := make(chan int, 3)
2. channel 的操作

发送数据

向一个 channel 发送数据的操作如下:

ch <- 21

接收数据

从一个 channel 中接收数据的操作如下:

x := <-ch

或者仅仅是接收数据但不使用,可以直接丢弃:

<-ch

使用 range 遍历 channel

也可以使用 range 的方式遍历从 channel 中接收数据,但是需要在通道关闭后:

for x := range ch {
   
   
    fmt.Println(x)
}

关闭 channel

关闭一个 channel 的操作如下:

close(ch)

3、goroutine 与 channel 的使用

下面介绍几种 channel 在使用中的特殊情况。

1. 阻塞情况

对于 channel 的使用,如果使用不慎,有可能会造成阻塞,以下是几种阻塞的情况

1) 无缓冲通道

对于无缓冲通道而言,发送和接收的操作必须同时发生,否则会进入阻塞状态。


func CapZeroChannel(ch chan int) {
   
   
    time.Sleep(5 * time.Second)
    ch <- 1
    fmt.Println("inner func, send msg:", time.Now().Format("2006-01-02 15:04:05"))
}

func main() {
   
   
    ch := make(chan int)

    go CapZeroChannel(ch)
    fmt.Println("before func:", time.Now
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值