老男孩教育专注IT教育10余年,只培养IT技术精英

全国免费咨询电话(渠道合作):400-609-2893

GO语言教程之select 条件语句

老男孩IT教育

常见问题

2021年5月17日 15:57

select 语句是Go中的一个控制结构,类似于switch语句,用于处理异步IO操作。

  select 语句是Go中的一个控制结构,类似于switch语句,用于处理异步IO操作。select会监听case语句中channel的读写操作,当case中channel读写操作为非阻塞状态(即能读写)时,将会触发相应的动作。

  每个case必须是一个通信操作,要么是发送要么是接收,select中的default子句总是可运行的。

  如果有多个case都可以运行,select会随机公平地选出一个执行,其他不会执行。如果没有可运行的case语句,且有default语句,那么就会执行default的动作。如果没有可运行的case语句,且没有default语句,select将阻塞,直到某个case通信可以运行。

  select 应用

  1、select 语句基本使用

package main

import "fmt"

func main() {
    var c1, c2, c3 chan int
    var i1, i2 int
    select {
    case i1 = <-c1:
        fmt.Printf("received ", i1, " from c1\n")
    case c2 <- i2:
        fmt.Printf("sent ", i2, " to c2\n")
    case i3, ok := (<-c3):
        if ok {
            fmt.Printf("received ", i3, " from c3\n")
        } else {
            fmt.Printf("c3 is closed\n")
        }
    default:
        fmt.Printf("no communication\n")
    }
}

  2、超时判断

package main

import (
    "fmt"
    "time"
)

func main() {
    ch := make(chan int)
    select {
    case i := <-ch:
        fmt.Printf("i = %d\n", i)
    case <-time.After(time.Second * 3):
        fmt.Println("time out")
    }
}

  3、判断channel是否阻塞

package main

import (
    "fmt"
)

func main() {
    // 在某些情况下是存在不希望channel缓存满了的需求的,可以用如下方法判断
    ch := make(chan int, 5)
    data := 0
    select {
    case ch <- data:
        fmt.Println("ch <- data")
    default:
        fmt.Println("default")
    }
}

  如果你想要学习GO语言课程,可以来我校试听。Go开发课程2021全面升级(周末班), 试听即送价值69元纸质教材一本!

  推荐阅读:

  学习网络安全有哪些就业方向?网络安全就业前景!

  Lambda表达式的作用及定义!Python培训班

  linux无法上网或联网怎么办?老男孩如何学好linux开发

本文经授权发布,不代表老男孩教育立场。如若转载请联系原作者。