golang中select case 的用途到底是啥

https://nanxiao.gitbooks.io/golang-101-hacks/content/posts/select-operation.html

---------------------------------------------------------------------------------

Select operation



Go‘s select operation looks similar to switch, but it‘s dedicated to poll send and receive operations channels. Check the following example:

package main

import (
        "fmt"
        "time"
)

func main() {
        ch1 := make(chan int)
        ch2 := make(chan int)

        go func(ch chan int) { <-ch }(ch1)
        go func(ch chan int) { ch <- 2 }(ch2)

        time.Sleep(time.Second)

        for {
                select {
                case ch1 <- 1:
                        fmt.Println("Send operation on ch1 works!")
                case <-ch2:
                        fmt.Println("Receive operation on ch2 works!")
                default:
                        fmt.Println("Exit now!")
                        return
                }
        }
}

The running result is like this:

Send operation on ch1 works!
Receive operation on ch2 works!
Exit now!

The select operation will check which case branch can be run, that means the send or receive action can be executed successfully. If more than one case are ready now, the select will randomly choose one to execute. If no case is ready, but there is a default branch, then the default block will be executed, else the select operation will block. In the above example, if the main goroutine doesn‘t sleep (time.Sleep(time.Second)), the other 2 func goroutines won‘t obtain the opportunity to run, so only default block in select statement will be executed.

The select statement won‘t process nil channel, so if a channel used for receive operation is closed, you should mark its value as nil, then it will be kicked out of the selection list. So a common pattern of selection on multiple receive channels looks like this:

for ch1 != nil && ch2 != nil {
    select {
    case x, ok := <-ch1:
        if !ok {
            ch1 = nil
            break
        }
        ......
    case x, ok := <-ch2:
        if !ok {
            ch2 = nil
            break
        }
        ......
    }
}  
时间: 2024-10-13 00:58:08

golang中select case 的用途到底是啥的相关文章

golang中select实现非阻塞及超时控制

// select.go package main import ( "fmt" "time" //"time" ) func main() { //声明一个channel ch := make(chan int) //声明一个匿名函数,传入一个参数整型channel类型ch go func(ch chan int) { ch <- 1 //往channel写入一个数据,此时阻塞 }(ch) //由于goroutine执行太快,先让它sle

select 中使用 case when 和 replace

在SELECT中,用CASE   例如:     select   a.Cname   as   Tcomname,b.Cname   as   TGoodname,D.nQuanty,c.cNote,   (case   when   c.iEvaluate='-1'  then   '差评'  when   c.iEvaluate='1'   then   '好评'   when   c.ievaluate='0'   then   '一般'   end)   as   ievaluate 

golang中tcp socket粘包问题和处理

转自:http://www.01happy.com/golang-tcp-socket-adhere/ 在用golang开发人工客服系统的时候碰到了粘包问题,那么什么是粘包呢?例如我们和客户端约定数据交互格式是一个json格式的字符串: {"Id":1,"Name":"golang","Message":"message"} 当客户端发送数据给服务端的时候,如果服务端没有及时接收,客户端又发送了一条数据上来

golang的select用法

早期的select函数是用来监控一系列的文件句柄,一旦其中一个文件句柄发生IO操作,该select调用就会被返回.golang在语言级别直接支持select,用于处理异步IO问题. select用法同switch类似,如下: timeout := make (chan bool, 1)ch := make(chan int) select { case <-ch: case <-timeout: fmt.Println("timeout!") default: fmt.Pr

golang中channel的超时处理

并发中超时处理是必不可少的,golang没有提供直接的超时处理机制,但可以利用select机制来解决超时问题. func timeoutFunc() { //首先,实现并执行一个匿名的超时等待函数 timeout := make(chan bool, 1) go func() { time.Sleep(1e9) //等待1秒钟 timeout <- true }() //然后,我们把timeout这个channel利用起来 select { case <- ch: //从ch中读到数据 cas

golang中四种方式实现子goroutine与主协程的同步

如何实现子goroutine与主线程的同步 第一种方式:time.sleep(),这种方式很太死板,就不演示了. 第二种方式:使用channel机制,每个goroutine传一个channel进去然后往里写数据,在再主线程中读取这些channel,直到全部读到数据了子goroutine也就全部运行完了,那么主goroutine也就可以结束了.这种模式是子线程去通知主线程结束. package main import ( "fmt" ) func main() { var chanTes

golang中interface接口的深度解析

什么是interface,简单的说,interface是一组method的组合,下面这篇文章主要给大家深度解析了关于golang中的interface接口,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧. 一 接口介绍 如果说gorountine和channel是支撑起Go语言的并发模型的基石,让Go语言在如今集群化与多核化的时代成为一道亮丽的风景,那么接口是Go语言整个类型系列的基石,让Go语言在基础编程哲学的探索上达到前所

select case when if 的一些用法

概述:sql语句中的case语句与高级语言中的switch语句,是标准sql的语法,适用于一个条件判断有多种值的情况下分别执行不同的操作. 首先,让我们看一下CASE的语法.在一般的SELECT中,其语法格式如下: CASE   <单值表达式>        WHEN <表达式值> THEN <SQL语句或者返回值>        WHEN <表达式值> THEN <SQL语句或者返回值>        ...        WHEN <表

CASE WHEN 及 SELECT CASE WHEN的用法

sql中的CASE WHEN then 也可以理解为程序中的三元表达式,可以实现相同的功能,不过CASE WHEN then功能更强大 示例一 简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' END --Case搜索函数 CASE WHEN sex = '1' THEN '男' WHEN sex = '2' THEN '女' ELSE '其他' END 示例二 根据这个国家人口数据,统计亚洲和北美洲的人口数量 如果使