GO语言学习(四)---chan

chan相关知识代码片段一—chan用于两个goruntime之间通信源代码//测试chanpackage mainimport "fmt"import "time"var strChan = make(chan string,3)func main(){ syncChan1 := make(chan struct{},1) //接收同步变量 ...
摘要由CSDN通过智能技术生成

chan相关知识

代码片段一—chan用于两个goruntime之间通信

源代码

//测试chan
package main

import "fmt"
import "time"

var strChan = make(chan string,3)

func main(){
    syncChan1 := make(chan struct{},1)  //接收同步变量  
    syncChan2 := make(chan struct{},2) //主线程启动了两个goruntime线程,
                                       //等这两个goruntime线程结束后主线程才能结束

    //用于演示接受操作
    go func(){
        <- syncChan1  //表示可以开始接收数据了,否则等待
        fmt.Println("[receiver] Received a sync signal and wait a second...")
        time.Sleep(time.Second)
        for{
            if elem,ok := <-strChan;ok{
                fmt.Println("[receiver] Received:",elem)
            }else{
                break
            }
        }
        fmt.Println("[receiver] Stopped.")
        syncChan2 <- struct{}{}
    }()

    //用于演示发送操作
    go func(){
        for i,elem := range []string{
  "a","b","c","d"}{
            fmt.Println("[sender] Sent:",elem)
            strChan <- elem
            if (i+1)%3==0 {
                syncChan1 <- struct{}{}
                fmt.Println("[sender] Sent a sync signal. wait 1 secnd...")
                time.Sleep(time.Second)
            }
        }
        fmt.Println("[sender] wait 2 seconds...")
        time.Sleep(time.Second)
        close(strChan)
        syncChan2 <- struct{}{}
    }()

    //主线程等待发送线程和接收线程结束后再结束
    fmt.Println("[main] waiting...")
    <- syncChan2
    <- syncChan2
    fmt.Println("[main] stoped")
}

运行结果

[main] waiting...
[sender] Sent: a
[sender] Sent: b
[sender] Sent: c
[sender] Sent a sync signal. wait 1 secnd...
[receiver] Received a sync signal and wait a second.
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值