TypechoJoeTheme

Dcr163的博客

统计

golang里的channel通道+select

2021-11-28
/
0 评论
/
915 阅读
/
正在检测是否收录...
11/28

golang里的channel通道

//go 里的channel并发
package main

import (
    "fmt"
    "sync"
)

//channel 单通道,只能添加值
func appendChannel(ch chan<- int) {
    defer wg.Done()
    for i := 0; i <10; i++ {
        ch <- i
    }
    close(ch)
}
//channel 单通道,把另一个通道的值取到另一个通道内
func addChannel(ch chan <- int,chDsc <-chan int) {
    defer wg.Done()
    for i := range chDsc {
        ch <- i+1
    }
    close(ch)
}

func popChannel(ch <-chan int){
    defer wg.Done()
    fmt.Println("===ch4===")
    for ii := range ch {
        fmt.Printf("%d",ii)
    }
    fmt.Println("===ch4===")
}
var wg sync.WaitGroup
func main() {
    //创建一个通道
    var ch = make(chan int,1)
    //添加值,把20放到 ch 这个通道内
    ch <- 20
    //关闭通道,不关闭通道会造成死锁
    close(ch)
    //取值
    a := <- ch
    fmt.Println(a)
    //如果channel里没有数据了,取出来的会是类型对应的零值
    fmt.Println(<- ch)

    var addNum int = 10
    var ch2 = make(chan int, 20)
    for i := 0; i < addNum; i++ {
        ch2 <- i
    }
    close(ch2)
    //使用for循环取值
    //for{
    //    v,err := <-ch2
    //    //需要判断err是否为 false,否则会死循环
    //    if !err{
    //        break
    //    }
    //    fmt.Println(v,err)
    //}
    //使用for range取值,推荐
    for i := range ch2 {
        fmt.Println(i)
    }

    var ch4 , ch3 = make(chan int),make(chan int)
    wg.Add(1)
    go appendChannel(ch3)
    fmt.Println("===ch3===")
    fmt.Println(len(ch3))
    fmt.Println("\n===ch3===")
    wg.Add(1)
    go addChannel(ch4,ch3)
    fmt.Println("===ch3===")
    fmt.Println(len(ch3))
    fmt.Println("===ch3===")
    wg.Add(1)
    go popChannel(ch4)
    wg.Wait()

    var ch5 = make(chan string, 10)
    var ch6 = make(chan string, 20)
    ch <- "PHP"
    //select 复用如果case里有多条满足了条件,会 随机 选择一个进行匹配
    select {
    case ch5 <- "go":
        fmt.Println("ch5里放入了go")
    case v := <-ch5:
        fmt.Println("ch5取了值:", v)
    case v := <-ch6:
        fmt.Println("ch6取了值:", v)
    case ch6 <- "JS":
        fmt.Println("ch6放了值")
    default:
        fmt.Println("什么都没操作~")
    }

}
go
朗读
赞(0)
版权属于:

Dcr163的博客

本文链接:

https://dcr163.cn/591.html(转载时请注明本文出处及文章链接)

评论 (0)