channel

使用channel实现Future任务
使用channel实现同步,make方式创建返回地址(可用),var ch chan int中ch值为nil
无缓冲channel特点:阻塞式,容量为0,长度为0,不能存储数据。具备同步能力,读写同步。channel应用于两个go程中,一个读一个写(go程数据通信(同步))
无缓存channel先取后放
有缓冲channel特点:非阻塞
作用:同步,通信

一.关闭channel

channel关闭后,只能读不能写

package main
import "fmt"
func main() {
    ch := make(chan int)
    go func() {
        for i := 0; i < 10; i++ {
            ch <- i
        }
        close(ch)
    }()
//方案1
    for msg := range ch {
        fmt.Println(msg)
    }
//方案2
    for {
        msg, ok := <-ch
        if ok {
            fmt.Println(msg)
        } else {
            break
        }
    }
}

二.单向channel

import "fmt"

func main() {
    ch:=make(chan int)
    go test7(ch)
    go test8(ch)
    for  {
        ;
    }
}

func test7(ch chan<- int){
    for i:=0;i<10 ;i++  {
        ch<-i
    }
}

func test8(ch <-chan int)  {
    for i:=0;i<10 ;i++  {
        msg:=<-ch
        fmt.Println(msg)
    }
}

三.go程的同步(主go程和子go程的同步)

3.1 sync.WaitGroup

import (
    "fmt"
    "sync"
    "time"
)

var group=new(sync.WaitGroup)

func main() {
    go test5()
    go test6()
    //有几个go程启动
    group.Add(2)
    //等待结束
    group.Wait()
}
func test5(){
    time.Sleep(2*time.Second)
    fmt.Println("5子go程执行了" )
    group.Done()
}
func test6(){
    time.Sleep(2*time.Second)
    fmt.Println("6子go程执行了" )
    group.Done()
}

3.2 channel.开启几个go程,就需要读取多少次

import (
    "fmt"
    "time"
)
var chs=make(chan int)
func main() {

    fmt.Println("主go程开始了")
    go test5()
    go test6()
    fmt.Println("主go程结束了")
    <-chs
    <-chs
}
func test5(){
    time.Sleep(2*time.Second)
    fmt.Println("5子go程执行了" )
    chs<-10
}
func test6(){
    time.Sleep(2*time.Second)
    fmt.Println("6子go程执行了" )
    chs<-10
}

3.3 主go程也sleep,只适合测试

import (
"fmt"
"time"
)
func main() {
fmt.Println("主go程开始了")
go test5()
go test6()
fmt.Println("主go程结束了")
time.Sleep(3time.Second)
}
func test5(){
time.Sleep(2
time.Second)
fmt.Println("5子go程执行了" )
}
func test6(){
time.Sleep(2*time.Second)
fmt.Println("6子go程执行了" )
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容