2.7 Go channel

channel简单示例

package main

import (
    "fmt"
    "time"
)

//channel的创建,发送,接收
func channe1(){
    //创建,channel是有类型的
    c1 := make(chan int)
    
    
    //接收,接收方必须是一个goroutine,并且必须的接收方,只发送不接收程序会报deadlock
    //通常使用匿名函数开一个与主程序同时执行的内部方法,即并发执行
    go func(){
        fmt.Println("接收数据准备")
        
        //阻塞式接收,没有数据时,程序一直等待
        //这里接收channel使用了io输出功能,io是可以被抢占控制权的,即IO的特性
        fmt.Println(<- c1)
        fmt.Println("接收数据完成")
        
        //关闭,不显式关闭时,channel会随主程序(即main)的运行结束而结束
        //如果“接收”处理数据的时间较长,就会出现主程序已经结果,但接收方还没处理完的情况
        //此时可以主程序sleep一段时间,等待接收方把数据处理完毕再
        close(c1)
        
        fmt.Println("接收结束")
    }()
    
    //发送数据,“接收”程序要在发送之前准备,
    //意思就是发送数据之前,要先为channel准备好接收
    //否则,执行<- 1将1发送到channel时,go发现没有人接收,会报deadlock
    //接收方是阻塞式的,没有数据发送就等待,所以不会直接报错
    c1 <- 1
    
    //接收方与主程序同时执行
    //主程序在此停止1毫秒,就相当于主程序等了接收方一毫秒
    time.Sleep(time.Millisecond)
}

func main(){
    channe1()
    fmt.Println("主程序结束")
}

输出

# go run chan1.go 
接收数据准备
1
接收数据完成
接收结束
主程序结束

猜你喜欢

转载自www.cnblogs.com/perfei/p/10703964.html