ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Go 通道(channel)

2022-07-26 22:36:49  阅读:167  来源: 互联网

标签:ch 协程 string chan ch1 Go channel 通道


通道(channel),就像一个可以用于发送类型化数据的管道,由其负责协程之间的通信,从而避开所有由共享内存导致的陷阱;这种通过通道进行通信的方式保证了同步性。数据在通道中进行传递:在任何给定时间,一个数据被设计为只有一个协程可以对其访问,所以不会发生数据竞争。

  • 创建通道 ch1 := make(chan string)
    构建一个 int 通道的通道: chanOfChans := make(chan chan int)
    带缓冲带的通道 ch1 := make(chan string, 0) 0 指可接收 0 个 string, 即(阻塞),如果时大于 0 的数值,则为(非阻塞),取决于指的大小。

  • 数据发送 ch1 <- '123' 将字符串 '123' 发送到 ch1 通道。

  • 数据接收 str2 := <- ch1 使用 str2 变量接收通道的数据。

  • 关闭通道 close(ch1)

package main

import (
	"fmt"
	"time"
)


func main() {
	ch := make(chan string)
	defer close(ch)
	go sendData(ch)
	go getData(ch)
	// 等待了 1 秒让两个协程完成,如果不这样,sendData() 就没有机会输出。
	time.Sleep(1e9)
}

func sendData(ch chan string) {
	ch <- "London"
	ch <- "Beijing"
}

func getData(ch chan string) {
	var input string
	// time.Sleep(2e9)
	for {
		input = <- ch
		fmt.Printf("input is (%v)\n", input)
	}
}

注意事项:

  • 如果 2 个协程需要通信,你必须给他们同一个通道作为参数才行。
  • getData() 使用了无限循环:它随着 sendData() 的发送完成和 ch 变空也结束了。
  • 如果移除一个或所有 go 关键字,程序无法运行,Go 运行时会抛出 panic:
    ---- Error run channel.exe with code Crashed ---- Program exited with code -2147483645: panic: all goroutines are asleep-deadlock!

通道阻塞

  1. 对于同一个通道,发送操作(协程或者函数中的),在接收者准备好之前是阻塞的:如果 ch 中的数据无人接收,就无法再给通道传入其他数据:新的输入无法在通道非空的情况下传入。所以发送操作会等待 ch 再次变为可用状态:就是通道值被接收时(可以传入变量)。
  2. 对于同一个通道,接收操作是阻塞的(协程或函数中的),直到发送者可用:如果通道中没有数据,接收者就阻塞了。

标签:ch,协程,string,chan,ch1,Go,channel,通道
来源: https://www.cnblogs.com/magower/p/16522800.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有