Go: channel

 

1. send-only chan<- & receive-only <-chan channel

package main

import (
    "fmt"
    "time"
)

func producer(ch chan<- int, exitChan chan struct{}) {
    for i := 0; i < 10; i++ {
        ch <- i * 2
    }
    close(ch)
    exitChan <- struct{}{}
}

func consumer(ch <-chan int, exitChan chan struct{}) {
    for {
        v, ok := <-ch
        if !ok {
            break
        }
        time.Sleep(time.Second)
        fmt.Println("<-chan", v)
    }
    exitChan <- struct{}{}
}
func main() {
    var ch chan int
    ch = make(chan int, 3)
    var exitChan chan struct{}
    exitChan = make(chan struct{}, 2)
    go producer(ch, exitChan)
    go consumer(ch, exitChan)
    // t := 0
    // for {
    //     _ = <-exitChan
    //     t++
    //     if t == 2 {
    //         break
    //     }
    // }

    t := 0
    for _ = range exitChan {
        t++
        if t == 2 {
            break
        }
    }
}

 

2. select

package main

import "fmt"

func main() {
    intChan := make(chan int, 5)
    stringChan := make(chan string, 3)
    for i := 0; i < cap(intChan); i++ {
        intChan <- i
    }
    for i := 0; i < cap(stringChan); i++ {
        stringChan <- "infringe " + fmt.Sprintf("%03d", i)
    }
label:
    for {
        select {
        case v := <-intChan:
            fmt.Println(v)
        case v := <-stringChan:
            fmt.Println(v)
        default:
            fmt.Println("default")
            break label
        }
    }
}

 

posted @ 2023-03-18 00:00  ascertain  阅读(8)  评论(0编辑  收藏  举报