golang channel的使用

channel常常结合go程使用,作为通信消息队列

var testChan chan int
    fmt.Println(testChan) // nil  未初始化,没地址
    testChan = make(chan int,0)  
    fmt.Println(testChan)  //0xc420072180  完成了初始化

    //1.往channel写会阻塞,直到消费者把它读出来
    testChan<-1

    //2.往缓冲为N的channel写,写满N个值后阻塞
    testChan = make(chan int,10)  
    for i:=0;i<12;i++{
    fmt.Println(i)    //0,1,2,3,4,5,6,7,8,9
    }

    //3.往已经关闭的channel写数据会panic
    close(testChan)
    testChan<-1    //panic: send on closed channel
   
   //4.从一个已经关闭了的非缓冲channel读出来的值是默认值
   close(testChan)
    i:=<-testChan  //i=0

    i,ok=<-testChan //i=0,ok=false

  //5.从一个已经关闭了的缓冲channel能读出来的关闭前遗留的值
    testChan = make(chan int, 4)
    fmt.Println(testChan)
    for i := 0; i < 4; i++ {
        testChan <- i
    }
    close(testChan)
    for i := 0; i < 6; i++ {
        i := <-testChan
        fmt.Println(i)   //0,1,2,3,0,0
    }

猜你喜欢

转载自www.cnblogs.com/fwdqxl/p/9298859.html