channel

Posted webclz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了channel相关的知识,希望对你有一定的参考价值。

1、channel通道是阻塞的,一个协程给通道发送数据,则必须有另一个协程接收数据,否则报错

可以建立很过个通道,指定哪个协程通过哪个通道读取数据

package main
import "fmt"
import "time"

func main(){


    var chanels [10]chan int

    for i := 0; i < 10; i++ {

        chanels[i] = make(chan int)

        go doWork(i,chanels[i])

    }

    for i := 0; i < 10; i++ {
        chanels[i]<-a+i
    }


    time.Sleep(1000*time.Millisecond)

}



func doWork(i int,c chan int){

    for{

        fmt.Printf("the work %d,received %d 
",i,<-c)

    }

}

2、可以返回一个channel,看下面这个修改

package main
import "fmt"
import "time"

func main(){


    var chanels [10]chan int

    for i := 0; i < 10; i++ {

        chanels[i] = createWork(i)

        // go doWork(i,chanels[i])

    }

    for i := 0; i < 10; i++ {
        chanels[i]<-a+i
    }


    time.Sleep(1000*time.Millisecond)

}



func createWork(i int) chan int{

    c := make(chan int)

    go func(){

        for{

        fmt.Printf("the work %d,received %d 
",i,<-c)

    }

    }()

    
    return c

}

 下面这个例子的执行结果

package main

import (
        "fmt"
        "time"
)



func say(s string) {
        for i := 0; i < 5; i++ {
                time.Sleep(100 * time.Millisecond)
                fmt.Println(s)
        }
}




func main() {
        go say("world")
        say("hello")
}

结果如下

hello
world
world
hello
hello
world
world
hello
world
hello

 发现hello会输出很多次

以上是关于channel的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin 协程Channel 通道 ④ ( Channel 通道的热数据流属性 | Channel 通道关闭过程 | Channel 通道关闭代码示例 )

FFmpeg拼接文件时报错channel element 1.0 is not allocated的分析思路和解决方法

FFmpeg拼接文件时报错channel element 1.0 is not allocated的分析思路和解决方法

FFmpeg拼接文件时报错channel element 1.0 is not allocated的分析思路和解决方法

FFmpeg拼接文件时报错channel element 1.0 is not allocated的分析思路和解决方法

Channel 的死锁