Go语言入门14(channel通道01)

这篇具有很好参考价值的文章主要介绍了Go语言入门14(channel通道01)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

channel(一)

​ channel用于goroutines之间的通信,让它们之间可以进行数据交换。像管道一样,一个goroutine_A向channel_A中放数据,另一个goroutine_B从channel_A取数据

channel 基本语法

// 因为channel是指针类型的数据类型,所以通过make来分配内存
// 使用make声明一个channel,里面可以存放string类型的数据
channel := make(chan string)
// 将tmp送到channel中
channel <- tmp
// 从channel中接受数据给tmp
tmp := <- channel
// 从channel中接受数据给tmp,如果没有接受到则ok值为false
tmp,ok := <- channel
// 关闭通道channel
close(channel)

无缓冲的通道

​ 没有缓冲的通道,如果routine A向通道中发送了一个数据,那么必须等到这个数据被其他routine 取出之后,才能继续往通道里发送,严格遵循”一进一出“原则,这也就要求两个routine 在同时对同一个通道进行写操作和取操作

  • sender端向channel中send一个数据,然后阻塞,直到receiver端将此数据receive
  • receiver端一直阻塞,直到sender端向channel发送了一个数据
// 两个routine分别对一个通道进行取放操作,并且对里面的数据+1,到2000截至
// 严格遵循“一进一出”
func Routine01(wg *sync.WaitGroup, count chan int) {
	defer wg.Done()
	for {
        // 从通道中拿取数据
		res, ok := <-count
		if !ok {
            // 说明通道中已经没有数据,或者已被关闭
			fmt.Println("finish!")
			break
		}
		fmt.Println(res)
		if res == 2000 {
			close(count)
			break
		}
		count <- res + 1
	}
}

func main() {
	var wg sync.WaitGroup
    // 新建一个无缓冲的通道count
	count := make(chan int)
	wg.Add(2)
    // 创建两个协程
	for i := 0; i < 2; i++ {
		go Routine01(&wg, count)
	}
    // 给管道里送一个数据,来开始操作
	count <- 1
	wg.Wait()
}

有缓冲的通道

​ 有缓冲的通道,可以控制里面的缓冲区大小,可以借助通道实现异步的取放操作文章来源地址https://www.toymoban.com/news/detail-434238.html

  • 容量:表示buffered channel最多可以缓冲多少个数据
  • 长度:表示buffered channel当前已缓冲多少个数据
  • 创建buffered channel的方式为make(chan TYPE,CAP)
// 新建Routine来模拟机器人工作
func Routine02(wg *sync.WaitGroup, count chan string) {
	defer wg.Done()
	for {
        // 从通道中分配工作
		tmp, ok := <-count
		if !ok {
            // 代表通道已经空了,或者已被关闭
			fmt.Println("No task else!")
			break
		}
		fmt.Println(tmp + " start!")
		time.Sleep(200 * time.Millisecond)
		fmt.Println(tmp + " done!")
	}
}

func main() {
	var wg sync.WaitGroup
    // 新建一个缓冲区大小为5的通道,来管理工作
	count := make(chan string, 5)
	wg.Add(2)
	fmt.Println("Work start!")
    // 往缓冲区中放一系列待完成的工作
	for i := 0; i < 5; i++ {
		tmp := fmt.Sprintf("Task %d", i)
		count <- tmp
		fmt.Println(tmp + " in!")
	}
	for i := 0; i < 2; i++ {
		go functions.Routine(&wg, count)
	}
    // 关闭通道
	close(count)
	wg.Wait()
}

到了这里,关于Go语言入门14(channel通道01)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • channel通道详解~Go进阶

    通道可以被认为是Goroutines通信的管道。类似于管道中的水从一端到另一端的流动,数据可以从一端发送到另一端,通过通道接收。 在前面讲Go语言的并发时候,我们就说过,当多个Goroutine想实现共享数据的时候,虽然也提供了传统的同步机制,但是Go语言强烈建议的是使用

    2024年02月12日
    浏览(41)
  • Go并发快速入门:Goroutine

    1.并发基础概念:进程、线程、协程 (1) 进程 可以比作食材加工的一系列动作 进程就是程序在操作系统中的一次执行过程 ,是由系统进行资源分配和调度的基本单位,进程是一个动态概念,是程序在执行过程中分配和管理资源的基本单位,每一个进程都有一个自己的地址空间

    2024年01月22日
    浏览(46)
  • Go语言入门记录:从基础到变量、函数、控制语句、包引用、interface、panic、go协程、Channel、sync下的waitGroup和Once等

    程序入口文件的包名必须是main,但主程序文件所在文件夹名称不必须是 main ,即我们下图 hello_world.go 在 main 中,所以感觉 package main 写顺理成章,但是如果我们把 main 目录名称改成随便的名字如 filename 也是可以运行的,所以迷思就在于写在文件开头的那个 package main 和 java

    2024年02月11日
    浏览(35)
  • 7 文件操作、单元测试、goroutine【Go语言教程】

    1.1 介绍 os.File 封装所有文件相关操作,File 是一个结构体 常用方法: 打开文件 关闭文件 1.2 应用实例 ①读文件 常用方法: ①bufio.NewReader(), reader.ReadString【带缓冲】 ②io/ioutil【一次性读取,适用于小文件】 读取文件的内容并显示在终端(带缓冲区的方式),使用 os.Open, file.

    2024年02月04日
    浏览(51)
  • GO语言网络编程(并发编程)并发介绍,Goroutine

    进程和线程 并发和并行 协程和线程 协程:独立的栈空间,共享堆空间,调度由用户自己控制,本质上有点类似于用户级线程,这些用户级线程的调度也是自己实现的。 线程:一个线程上可以跑多个协程,协程是轻量级的线程。 goroutine 只是由官方实现的超级\\\"线程池\\\"。 每个

    2024年02月09日
    浏览(52)
  • Go语言入门记录:从channel的池应用、sync的Pool、benchmark、反射reflect、json处理、http、性能分析和一些编程习惯

    channel的一对一会阻塞,添加buffer不会阻塞。 buffered Channel实现对象池。 sync.Pool 的介绍。 获取时先去私有对象中获取,如果不存在就在相同Processor中的共享池中获取,如果还没有,则去其他Processor中去获取。 存放时,如果私有对象不存在,就放在私有对象中,如果存在就放在

    2024年02月10日
    浏览(48)
  • Golang中的管道(channel) 、goroutine与channel实现并发、单向管道、select多路复用以及goroutine panic处理

    目录 管道(channel) 无缓冲管道 有缓冲管道 需要注意 goroutine与channel实现并发 单向管道 定义单向管道 将双向管道转换为单向管道 单向管道作为函数参数 单向管道的代码示例 select多路复用 案例演示 goroutine panic处理 案例演示 管道(channel)是 Go 语言中实现并发的一种方式,

    2024年02月06日
    浏览(45)
  • Go语言中的Channel

    Channel是Go语言中一种重要的并发原语,它允许goroutine之间安全地交换数据。Channel是一个类型化的队列,它可以存储一个特定类型的值。goroutine可以通过发送和接收操作来向channel中写入和读取数据。 Channel的类型由其元素类型和容量决定。元素类型是指channel中存储的值的类型

    2024年01月17日
    浏览(30)
  • Golang 中goroutine、channel 生产环境中例子和应用

    Golang 学习生产环境中例子和应用 大家好,今天我们来聊一聊goroutine、channel产品开发中的应用。如果你还不知道这些是什么,那么恭喜你,你来对地方了!因为我也不知道。 好了,开玩笑了。其实这些都是Go语言中非常重要的概念,尤其是在并发编程中。那么我们来看一下,

    2024年02月10日
    浏览(55)
  • GO语言网络编程(并发编程)Channel

    1.1.1 Channel 单纯地将函数并发执行是没有意义的。函数与函数间需要交换数据才能体现并发执行函数的意义。 虽然可以使用共享内存进行数据交换,但是共享内存在不同的goroutine中容易发生竞态问题。为了保证数据交换的正确性,必须使用互斥量对内存进行加锁,这种做法势

    2024年02月09日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包