Golang语言Channel(有缓冲和无缓冲)的使用方式

 更新时间:2026年07月08日 09:14:13   作者:As_wind_  
本文主要介绍了Golang语言Channel(有缓冲和无缓冲)的使用方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、无缓存 channel

无缓冲channel 可用于两个goroutine 之间 传递信号,比如以下示例:

顺序打印1 至 100 的奇数和偶数:

import (
	"fmt"
	"time"
)

func main() {
	block := make(chan struct{})
	go odd(block)
	go even(block)
	time.Sleep(time.Second)
	fmt.Println("done")

}

func odd(block chan struct{}) {
	for i := 1; i < 100; i++ {
		<-block
		if i%2 == 1 {
			fmt.Println("奇数:", i)
		}
	}
}

func even(block chan struct{}) {
	for i := 1; i < 100; i++ {
		<-block
		if i%2 == 0 {
			fmt.Println("偶数:", i)
		}
	}
}

上面这段代码,我们使用一个无缓冲channel  作为两个gorountie 之间的信号传递的桥梁。

主子 goroutine  之间传递信号

func main() {
	block := make(chan struct{})
	go func() {
		for i := 0; i < 10; i++ {
			fmt.Println(i)
		}
		close(block)
	}()
	<-block
	fmt.Println("done")

}

我们使用一个无缓冲channel 作为主子goroutine 之间的信号传递的桥梁,通过信号传递,主gorountine  运行结束直接再退出。

二、有缓冲 channel

有缓冲channel  可以作用于解耦操作,模拟消息队列。“生产者”和“消费者”只需各自处理channel ,实现解耦。

解耦生产者和消费者。

func main() {
	
	task := make(chan int, 10)
	go consumer(task)

	//生成者
	for i := 0; i < 10; i++ {
		task <- i
	}
	time.Sleep(time.Second * 2)
}

func consumer(task <-chan int) {
	for i := 0; i < 10; i++ {
		go func(id int) {
			t := <-task
			fmt.Println(id, t)
		}(i)
	}
}

我们使用一个有缓冲的channel , 将生产者,消费者做解耦操作

输出结果:

三、超时操作和定时器

我们还可以通过select 和channel ,实现超时操作和定时器

超时操作:

import (
	"fmt"
	"time"
)

func main() {
	c1 := make(chan string, 1)
	go func() {
		time.Sleep(2 * time.Second)
		c1 <- "result 1"
	}()

	select {
	case res := <-c1:
		fmt.Println(res)
	case <-time.After(1 * time.Second):
		fmt.Println("timeout 1")
	}

	c2 := make(chan string, 1)

	go func() {
		time.Sleep(2 * time.Second)
		c2 <- "result 2"
	}()

	select {
	case res := <-c2:
		fmt.Println(res)
	case <-time.After(3 * time.Second):
		fmt.Println("timeout 1")
	}

}

通过c1 和 c2 两个channel ,分别模拟出超时和未超时场景

定时器:

func main() {
	ticker := time.NewTicker(500 * time.Millisecond)
	done := make(chan bool)
	go func() {
		for {
			select {
			case <-done:
				return
			case t := <-ticker.C:
				fmt.Println("Tick at ", t)
			}
		}
	}()
	time.Sleep(1600 * time.Millisecond)
	ticker.Stop()
	done <- true
	fmt.Println("Ticker stopped")
}

我们定义一个打点器,每间隔500Ms执行一次操作,当打点stop时,通过一个无缓冲channel 传递退出信号

三、总结

本文我们介绍了一些关于 Channel 的使用方式,我们在阅读完本文后可以了解无缓冲 channel 作为信号传递的使用方式和有缓冲 channel 解耦操作的方式,以及 channel 与 select 配合使用的用法。

到此这篇关于Golang语言Channel(有缓冲和无缓冲)的使用方式的文章就介绍到这了,更多相关Golang Channel 有缓冲和无缓冲内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Golang 运算符及位运算详解

    Golang 运算符及位运算详解

    这篇文章主要介绍了Golang 运算符及位运算详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Golang 语言控制并发 Goroutine的方法

    Golang 语言控制并发 Goroutine的方法

    本文我们介绍了不同场景中分别适合哪种控制并发 goroutine 的方式,其中,channel 适合控制少量 并发 goroutine,WaitGroup 适合控制一组并发 goroutine,而 context 适合控制多级并发 goroutine,感兴趣的朋友跟随小编一起看看吧
    2021-06-06
  • Golang 中的 strconv 包常用函数及用法详解

    Golang 中的 strconv 包常用函数及用法详解

    strconv是Golang中一个非常常用的包,主要用于字符串和基本数据类型之间的相互转换,这篇文章主要介绍了Golang中的strconv包,需要的朋友可以参考下
    2023-06-06
  • golang实现的文件上传下载小工具

    golang实现的文件上传下载小工具

    这篇文章主要介绍了golang实现的文件上传下载小工具,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下
    2020-12-12
  • 使用Go语言编写一个毫秒级生成组件库文档工具

    使用Go语言编写一个毫秒级生成组件库文档工具

    在开发组件库的过程中,文档无疑是不可或缺的一环,在本文中将尝试将Go语言与前端技术巧妙融合,以创建一款能在毫秒级别完成文档生成的工具,需要的可以参考下
    2024-03-03
  • Go语言中切片展开操作符的实现示例

    Go语言中切片展开操作符的实现示例

    在Go语言编程中,我们经常会遇到处理多维切片数据的场景,今天我们来深入探讨一个非常实用但容易被忽视的语法特性-切片展开操作符,感兴趣的可以了解一下
    2025-10-10
  • Go语言kube-scheduler深度剖析开发之scheduler初始化

    Go语言kube-scheduler深度剖析开发之scheduler初始化

    这篇文章主要介绍了Go语言kube-scheduler深度剖析开发之scheduler初始化实现过程示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • Go语言使用HTTP包创建WEB服务器的方法

    Go语言使用HTTP包创建WEB服务器的方法

    这篇文章主要介绍了Go语言使用HTTP包创建WEB服务器的方法,结合实例形式分析了Go语言基于HTTP包创建WEB服务器客户端与服务器端的实现方法与相关注意事项,需要的朋友可以参考下
    2016-07-07
  • golang与pgsql交互的实现

    golang与pgsql交互的实现

    本文主要介绍了golang与pgsql交互的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • 深入了解Golang中的格式化输出

    深入了解Golang中的格式化输出

    fmt是Go语言中用于控制文本输出的常用标准库,文中将通过示例详细讲解一下Go语言中不同形式的格式化输出,感兴趣的小伙伴可以了解一下
    2022-11-11

最新评论