Channel 基本使用

简介: Channel 基本使用

channel


channel 是有类型的管道,可以用 channel 操作符 <- 对其发送或者接收值。

创建 channel


c := make(chan int)

注意:管道必须指定类型,比如这里是 int,即往管道里传送的数据只能是 int 类型。当然可以是 interface {} 这种空接口方式,这样就可以传送各种数据类型了

也可以用 var 来声明管道,但是好像没啥意义

package main
import "fmt"
func main() {
    var c chan int
    fmt.Printf("%T %v\n", c, c)
    d := make(chan int)
    fmt.Printf("%T %v\n", d, d)
}

输出

chan int <nil>
chan int 0xc42006e060

管道方向


ch <- v // Send v to channel ch. v := <-ch // Receive from ch, and // assign value to v.

“箭头” 就是数据流的方向

注意接受时候 <- 和 chan 变量之间没有空格,虽然有空格也不会报错,但是 ide 会提示,因此还是依照规范不空格比较好

基本使用


package main import "fmt" func foo(i int, c chan int) { c <- i fmt.Println("send:", i) } func main() { c := make(chan int) go foo(0, c) res := <-c fmt.Println("receive:", res) }

输出

send: 0
receive: 0

默认情况下,在另一端准备好之前,发送和接收都会阻塞。这使得 goroutine 可以在没有明确的锁或竞态变量的情况下进行同步。

发动和接收数据应当在并行线上,而不能是串行的,因为发送和接收都会阻塞,如果串行,就会死锁(就是一个一直阻塞在那等对端),但不用为此操心,因为 go 在执行时候(编译会通过)会报错,比如:

package main
func main() {
    c := make(chan int)
    c <- 0
    <-c
}

报错:

fatal error: all goroutines are asleep - deadlock!
相关文章
|
人工智能 编解码 芯片
告别低效沟通|让技术提问不再头疼-这套高效AI提问模板来帮你
不会向ai提问,不知道怎么提问的 可以看看
21422 1
告别低效沟通|让技术提问不再头疼-这套高效AI提问模板来帮你
|
存储 缓存 测试技术
微服务注册中心的原理和实现方式
【2月更文挑战第19天】注册中心可以说是实现服务化的关键,因为服务化之后,服务提供者和服务消费者不在同一个进程中运行,实现了解耦,这就需要一个纽带去连接服务提供者和服务消费者,而注册中心就正好承担了这一角色。
|
SQL XML Oracle
Mybatis动态SQL语句查询,实现一个参数 可查询多个字段。
Mybatis动态SQL语句查询,实现一个参数 可查询多个字段。
1015 0
Mybatis动态SQL语句查询,实现一个参数 可查询多个字段。
|
7月前
|
存储 弹性计算 网络安全
阿里云用户上云流程参考:从账号注册、实名认证到领取和使用优惠券流程指南
不管我们是需要在阿里云平台注册域名还是需要购买云服务器及其他云产品,第一步都首要完成账号注册与实名认证流程,此为后选购各类云产品的必要前提。同时,在购买过程中,部分云服务器及其他云产品支持叠加使用阿里云赠送的各种优惠券,有效降低采购成本。本文将以图文的形式,为大家解析从阿里云账号注册、实名认证以及优惠券领取与使用的完整流程,助力用户以更优价格选购心仪的云产品。
681 11
|
7月前
|
数据采集 弹性计算 供应链
阿里云服务器ECS抢占式实例是什么?抢占式实例优缺点分析
阿里云ECS抢占式实例(原竞价实例)是一种低成本、按小时结算的付费模式,价格最低可至按量付费的1折,最高节省90%成本。适用于无状态、容错性强的业务,如大数据分析、科学计算、测试等。但存在被中断回收风险,当市场价格波动或资源紧张时实例将被释放,数据可能丢失,故不建议用于数据库等有状态应用。支持设置自动出价或手动限价,可选1小时保护期以提升稳定性。详情参考阿里云官方文档。
|
机器学习/深度学习 人工智能 自然语言处理
人工智能应用领域有哪些
本文全面探讨了人工智能(AI)的应用领域和技术核心,涵盖医疗、交通、金融、教育、制造、零售等多个行业,并分析了AI技术的局限性及规避策略。同时,介绍了生成式人工智能认证项目的意义与展望。尽管AI发展面临数据依赖和算法可解释性等问题,但通过优化策略和经验验证,可推动其健康发展。未来,AI将在更多领域发挥重要作用,助力社会进步。
|
API 开发工具 开发者
HarmonyOS NEXT实战:拨打电话
本课程介绍如何在HarmonyOS SDK中使用Telephony Kit实现拨打电话功能。通过CallPhoneDemoPage示例,讲解如何输入电话号码并调用makeCall接口拨号,涉及call模块的使用及设备通话能力检测。
8155 0
|
存储 缓存 网络协议
深入分析Channel和FileChannel
我是小假 期待与你的下一次相遇 ~
224 2
|
11月前
|
弹性计算 云计算
阿里云服务器如何实现自动伸缩
阿里云服务器(ECS)的自动伸缩功能可以通过弹性伸缩服务(Auto Scaling)实现,该服务能够根据业务需求动态调整计算资源。 **一、准备工作:** 在实现自动伸缩配置之前,需完成以下准备工作: 1.创建阿里云账号并完成实名认证。(登录账号过程中有不懂的可以看小编的教程帖) 2.开通弹性伸缩服务(ESS),使用弹性伸缩服务(ESS)实现ECS实例的自动伸缩, 弹性伸缩服务(ESS)可以根据业务需求自动创建或移除ECS实例,实现计算能力的动态调整。 3.创建专有网络VPC和安全组,以提高网络的安全性和隔离性。
|
API 开发者
了解 HTTP 的PUT 与 POST方法的综合指南
HTTP PUT 和 POST 方法是构建 Web 应用与 API 的核心工具,用于资源的创建与更新。PUT 方法通过指定 URL 更新或创建完整资源,具有幂等性;而 POST 方法更灵活,主要用于创建新资源,但不具备幂等性。本文详细对比了两者在请求体、URL 使用、资源处理等方面的区别,并提供了实际应用示例,帮助开发者根据场景选择合适的方法以优化 API 设计。
1119 13