go channel初步

go 关键字跟随的函数,异步执行,并且可以阻塞,类似于js 的 async 函数中 await 异步结果

协程间通过 channel  传递信息,并且 channel 带有阻塞性,加上 go函数 的阻塞性,所以函数编写类似串行执行

但还是要注意是异步执行,结果出现的时间和串行不同。

复制代码
package main

import(
    "fmt"
    "time"
)

var ch chan int = make(chan int,2);

func chPush(){
    fmt.Println("before push.")
    for i:=0;i<5;i++{
        // time.Sleep(100*time.Millisecond)
     
// 必须要读取以后,才能再压入一个。容量是2,所以一次可以压入2个数据
        ch <- i 
        fmt.Println("push:",i) 
    }
    fmt.Println("after push.")
}
func chPop(){
    fmt.Println("before pop.")
    for i:=0;i<5;i++{
        time.Sleep(100*time.Millisecond)
// 堵塞,必须要有数据,才能读取。另外,此处读取一个数据,chPush 会立即压入一个数据
  n := <- ch fmt.Println("pop:",n) } 
  fmt.Println(
"after pop.")
}

func main(){
  fmt.Println(
"begin:")
  go chPush() // 异步,不会等待
  
  fmt.Println(
"follow go push. no choke")
  time.Sleep(
1000 * time.Millisecond)
  go chPop()
  fmt.Println(
"follow go pop. no choke but delayed by sleep")

  // 主线程可能会先于子协程结束,所以要某种方式等待一下
  time.Sleep(1000 * time.Millisecond) 

  fmt.Println(
"end.")
}
复制代码

 

posted @   忘忧般若汤  阅读(51)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示