golang chan数据类型的理解

golang 中go函数可以开启一个携程
例如:

func main() {
    fmt.Println("main start")

    go func() {
        fmt.Println("goroutine")
    }()

    time.Sleep(1 * time.Second)

    fmt.Println("main end")
}

输出:
main start
goroutine
main end


func main() {
    str := ""
    go func() {
        str = "goroutine"
    }()
    time.Sleep(1*time.Second)
    fmt.Println(str)
}
输出:
goroutine

chan用法

// 声明不带缓冲的通道
ch1 := make(chan string)

// 声明带10个缓冲的通道
ch2 := make(chan string, 10)

// 声明只读通道
ch3 := make(<-chan string)

// 声明只写通道
ch4 := make(chan<- string)



func main() {
    // 构建一个同步用的通道。
    ch := make(chan int) 
    // 开启一个并发匿名函数
    go func() {
        fmt.Println("start goroutine")
        // 匿名 goroutine 即将结束时,通过通道通知 main 的 goroutine,这一句会一直阻塞直到 main 的 goroutine 接收为止。
        ch <- 0 
        fmt.Println("exit goroutine")
    }()
    fmt.Println("wait goroutine")
    // 开启 goroutine 后,马上通过通道等待匿名 goroutine 结束。
    <-ch  //这里会一直等待写入完成整个通道才回结束
  
    fmt.Println("all done")
}




func main() {
    // 构建一个通道
    ch := make(chan int)
    // 开启一个并发匿名函数
    go func() {
        // 从3循环到0
        for i := 3; i >= 0; i-- {
            // 发送3到0之间的数值
            ch <- i
            // 每次发送完时等待
            time.Sleep(time.Second)
        }
    }()
    // 遍历接收通道数据
    for data := range ch {
        // 打印通道数据
        fmt.Println(data)
        //当接收到数值 0 时,停止接收。如果继续发送,由于接收 goroutine 已经退出,没有 goroutine 发送到通道,因此运行时将会触发宕机报错。
        if data == 0 {
                break
        }
    }
}


输出:
3
2
1
0

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

推荐阅读更多精彩内容