• Go语言之通道


     1 package main
     2 
     3 import (
     4     "fmt"
     5 )
     6 
     7 func main() {
     8     //channel是可以让一个goroutine发送特定值到另一个goroutine的通信机制。
     9     //声明通道类型
    10     var a chan int //声明一个int类型的通道 ,声明之后需要对它进行初始化
    11     fmt.Println(a)
    12     ch := make(chan int, 10) //进行初始化 有缓冲的通道
    13     ch <- 10                 //将10发送到通道中
    14     x := <-ch                //从通道中将10取出来赋值给x
    15     fmt.Println(x)
    16     close(ch) //关闭通道
    17     //无缓冲通道
    18     ch1 := make(chan int)
    19     go recv(ch1)
    20     ch1 <- 20
    21 }
    22 
    23 func recv(c chan int) {
    24     ret := <-c
    25     fmt.Println(ret)
    26 }

    for range循环读取通道中的值:

     1 package main
     2 
     3 import "fmt"
     4 
     5 func main() {
     6 
     7     a := make(chan int)
     8     b := make(chan int)
     9     go func() {
    10         for i := 0; i < 20; i++ {
    11             a <- i
    12         }
    13         close(a)
    14     }()
    15     go func() {
    16         for{
    17             i,ok:=<-a
    18             if !ok{
    19                 break
    20             }
    21             b<-i
    22         }
    23         close(b)
    24     }()
    25 
    26     for i:=range b{
    27         fmt.Println(i)
    28     }
    29 }

    单向通道:

    • chan<- int是一个只写单向通道(只能对其写入int类型值),可以对其执行发送操作但是不能执行接收操作;
    • <-chan int是一个只读单向通道(只能从其读取int类型值),可以对其执行接收操作但是不能执行发送操作。

    在函数传参及任何赋值操作中可以将双向通道转换为单向通道,但反过来是不可以的。

    select多路复用:

    
    
    package main

    import "fmt"

    func main() {
    ch := make(chan int, 1)
    for i := 0; i < 10; i++ {
    select {
    case x := <-ch:
    fmt.Println(x)
    case ch <- i:
    }
    }
    }
    
    

    使用select语句能提高代码的可读性。

    • 可处理一个或多个channel的发送/接收操作。
    • 如果多个case同时满足,select会随机选择一个。
    • 对于没有caseselect{}会一直等待,可用于阻塞main函数。
  • 相关阅读:
    POJ2001Shortest Prefixes[Trie]
    UVA
    POJ2528Mayor's posters[线段树 离散化]
    COGS130. [USACO Mar08] 游荡的奶牛[DP]
    POJ1962Corporative Network[带权并查集]
    BZOJ1798: [Ahoi2009]Seq 维护序列seq[线段树]
    洛谷U4859matrix[单调栈]
    COGS247. 售票系统[线段树 RMQ]
    COGS1008. 贪婪大陆[树状数组 模型转换]
    COGS182 [USACO Jan07] 均衡队形[RMQ]
  • 原文地址:https://www.cnblogs.com/yh2924/p/12450693.html
Copyright © 2020-2023  润新知