golang select 小结

栏目: Go · 发布时间: 7年前

内容简介:从不同并发执行的协程中,获取数据可以用select来完成。select监听的多个通道,也可以用通道发送数值。1、如果多个通道都阻塞了,会等待知道其中一个通道可以处理。2、如果多个通道都可以处理,随机选取一个处理。

select 介绍

从不同并发执行的协程中,获取数据可以用select来完成。select监听的多个通道,也可以用通道发送数值。

select {
// 接收数据
case u:= <- ch1:
        ...
// 发送数据
case v:= <- ch2:
        ...
        ...
default: // no value ready to be received
        ...
}

select 基本用法

1、如果多个通道都阻塞了,会等待知道其中一个通道可以处理。

2、如果多个通道都可以处理,随机选取一个处理。

3、如果没有通道操作可以操作并且写了default语句,会执行:default(永远是可以运行的)

4、如果防止select堵塞,可以写default来确保发送不被堵塞,没有case的select就会一直堵塞。

5、当select做选择case和default操作时,case的优先级大于default。

6、select语句实现了一种监听模式,通常在无限循环中使用,通过在某种情况下,通过break退出循环。

示例1

package main

import (
    "time"
    "fmt"
)

func doneSelect(ch chan int)  {
    for  {
        fmt.Println("for循环-输出-start")
        select {
        case data := <-ch:
            fmt.Println(data)
            break // 使用break只会跳出select
            //return   使用return会跳出for循环
        default:
            fmt.Println("select default testing")
        }
        fmt.Println("for循环-结束-end")
    }
    fmt.Println("for循环-跳出-end")
}
func do()  {
    ch := make(chan int)
    go doneSelect(ch)
    ch <- 666
}
func main()  {
    do()
    time.Sleep(3*time.Second)
}

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

挑战编程技能

挑战编程技能

Brian P. Hogan / 臧秀涛 / 人民邮电出版社 / 2017-2 / 39.00元

新手程序员在具备了理论基础后,面对实际项目时,往往不知道如何解决问题;有经验的程序员在学习了一门新语言后,也会有很多不知道如何使用的特性。针对程序员的这一普遍困惑,资深软件工程师Brian P. Hogan在这本书中总结了57道练习题,教他们如何锤炼技能。这些练习题的难度会逐渐增加,使得编程训练充满挑战又乐趣多多。一起来看看 《挑战编程技能》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

在线进制转换器
在线进制转换器

各进制数互转换器

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具