<>

作者: 凹大猫的鱼 | 来源:发表于2018-09-29 14:59 被阅读0次

    通道的高级玩法

    单向通道

    单向通道是只允许写或者读的通道,定义方式如下:

    intChan1 := make(chan int)
    intChan2 := make(<- chan int ) //只读
    intChan2 := make(chan<- int ) //只写
    

    通道的读写

    for语句读写


    ch1 := make(chan int, 2)    
    ch1 <- 3
    close(ch1)
    for elem := range ch1{
        fmt.Println(elem)
    }
    
    1.for 在close之前会一直阻塞!!!!!!
    2.如果为Nil会一直阻塞在for
    3.就算被关闭,for也会读出里面的数据,然后停止掉,执行下面的操作。
    

    select


    1.select 分为default和case分支,如果没有case满足会执行default
    2.如果没有default分支且没有case满足,那么select就会阻塞
    3.通道关闭了,但可能还能读到通道里面的数据,所以最好通过读取操作的第二个值判断是否已经关闭了通道。
    4.select只能执行一次,所以要想定时或者连续调用,通常需要和for配合,但break操作只会跳出select的case,影响不到外面的for。
    

    select的分支选择规则

    1.对于每个case,都至少包含一个代表发送或者接收操作的表达式,同时也可以包含其他的。
    2.case表达式会按照代码顺序全部求值
    3.对于每一个case,在发送或者接收的时候如果处于阻塞,就说明此case不满足条件。
    4.满足条件的case如果大于1会随机选取一个执行,如果等于1执行满足的,如果为0执行default,没default阻塞。
    5.并行安全主要在于case里面有没有不安全的操作。
    

    思考题

    select里面语句通道关闭,怎么屏蔽掉所在分支

    个人感觉可以弄成nil
    

    如果select和for配合怎么跳出for的循环

    用go语言的标签,配合goto end 或者break loop
    
    break只能在for前面,且跳转后不执行for,goto的标签可以在for前面或者后面,跳转后执行后面的代码。
    

    相关文章

      网友评论

          本文标题:<>

          本文链接:https://www.haomeiwen.com/subject/awtboftx.html