go之select

简介: go之select

一、select超时检测

package csp
 
import (
  "fmt"
  "testing"
  "time"
)
 
func service() string {
  time.Sleep(time.Millisecond * 50)
  return "Done"
}
 
//异步 chan在go中是一个通道有可读可写的chan,也存在只读只写的chan 异步返回
func AsyncService() chan string {
  //创建接受通道
  retCh := make(chan string, 1)
  go func() {
    ret := service()
    fmt.Println("returned result.")
    //chan放数据
    retCh <- ret
    fmt.Println("service exited.")
  }()
  return retCh
}
 
//多路选择、超时
func TestSelect(t *testing.T) {
  //使用select监听
  select {
  case ret := <-AsyncService():
    t.Log(ret)
  //  设置超时等待
  case <-time.After(time.Millisecond * 100):
    t.Error("time out")
 
  }
}
超时设置为100的执行
=== RUN   TestSelect
returned result.
service exited.
    select_test.go:33: Done
--- PASS: TestSelect (0.06s)
PASS
超时设置为50
=== RUN   TestSelect
returned result.
service exited.
    select_test.go:36: time out
--- FAIL: TestSelect (0.06s)
 
FAIL

二、channel生产者与消费者

package csp
 
import (
  "fmt"
  "sync"
  "testing"
)
 
//生产者
func dataProducer(ch chan int, wg *sync.WaitGroup) {
  go func() {
    for i := 0; i < 10; i++ {
      //给通道添加数据
      ch <- i
    }
    //关闭channel,向关闭的channel发送数据,会导致panic
    close(ch)
    //ch <- -1 //panic: send on closed channel
    wg.Done()
  }()
}
 
//消费者
func dataReceiver(ch chan int, wg *sync.WaitGroup) {
  go func() {
    for {
      //从通道取数据,ok为bool值,true表示正常接收,false表示通道关闭
      //关闭通道,接收数据,返回零值
      if data, ok := <-ch; ok {
        fmt.Println(data)
      } else {
        break
      }
    }
    wg.Done()
  }()
}
 
func TestCloseChannel(t *testing.T) {
  var wg sync.WaitGroup
  //创建通道
  ch := make(chan int)
  wg.Add(1)
  //生成数据
  dataProducer(ch, &wg)
  wg.Add(1)
  //消费数据
  dataReceiver(ch, &wg)
  wg.Add(1)
  //消费数据
  dataReceiver(ch, &wg)
  wg.Wait()
}
=== RUN   TestCloseChannel
0
1
2
3
4
5
6
7
8
9
--- PASS: TestCloseChannel (0.00s)
PASS
相关文章
|
供应链 Go
掌握Go语言:利用Go语言的单向通道和select语句,提升库存管理效率(21)
掌握Go语言:利用Go语言的单向通道和select语句,提升库存管理效率(21)
184 0
|
程序员 Go
Golang深入浅出之-Select语句在Go并发编程中的应用
【4月更文挑战第23天】Go语言中的`select`语句是并发编程的关键,用于协调多个通道的读写。它会阻塞直到某个通道操作可行,执行对应的代码块。常见问题包括忘记初始化通道、死锁和忽视`default`分支。要解决这些问题,需确保通道初始化、避免死锁并添加`default`分支以处理无数据可用的情况。理解并妥善处理这些问题能帮助编写更高效、健壮的并发程序。结合使用`context.Context`和定时器等工具,可提升`select`的灵活性和可控性。
304 2
|
8月前
|
人工智能 监控 Kubernetes
Go语言在select语句中实现优先级
Go语言中的`select`语句用于监控多个Channel的发送或接收操作,选择就绪的分支执行。它支持多种使用场景,如空`select`永久阻塞、单`case`阻塞读写、多`case`随机选择、配合`default`实现非阻塞操作等。通过嵌套`select`还可实现执行优先级,适用于如Kubernetes中任务调度等实际场景。
104 0
|
8月前
|
Go
理解 Go 语言中的 select 用法
本文深入解析了Go语言中`select`的用法,它类似于`switch case`,但仅用于通道(channel)的操作。文章通过多个示例说明了`select`的基本用法、避免死锁的方法、随机性特点以及如何实现超时机制。同时总结了`select`与`switch`的区别:`select`专用于通道操作,case执行是随机的,需注意死锁问题,且不支持`fallthrough`和函数表达式。
329 1
理解 Go 语言中的 select 用法
|
6月前
|
Go 开发者
Go语言实战案例:使用select监听多个channel
本文为《Go语言100个实战案例 · 网络与并发篇》第5篇,详解Go并发核心工具`select`的使用。通过实际案例讲解如何监听多个Channel、实现多任务处理、超时控制和非阻塞通信,帮助开发者掌握Go并发编程中的多路异步事件处理技巧。
|
8月前
|
监控 Go 开发者
深入解析 go 语言中的 select 语句
在 Go 语言中,`select` 是专为并发编程设计的控制结构,用于在多个 channel 操作间进行非阻塞选择。它类似于 `switch`,但所有 case 分支必须是 channel 的 I/O 操作。本文通过通俗易懂的语言和丰富代码示例,详细讲解 `select` 的各种用法,包括基本语法、空 `select`、多分支选择、`default` 分支、特点总结及最佳实践,适合初学者和有经验的开发者学习参考。掌握 `select`,能有效提升 Go 并发编程的灵活性与效率。
283 6
|
8月前
|
Go 调度 开发者
Go 并发编程基础:select 多路复用
Go 语言中的 `select` 是一种强大的并发控制结构,用于同时监听多个通道操作。它支持随机选择就绪的通道、阻塞等待以及通过 `default` 实现非阻塞通信。结合 `time.After()`,可轻松实现超时机制,适用于网络请求、任务调度等场景。本文详细介绍了 `select` 的基本用法、特性及实战技巧,如合并多通道输入、处理通道关闭等,帮助开发者高效管理协程与通道交互,避免常见陷阱。
|
Go
go select 使用总结
go select 使用总结
214 1
|
Go
Go并发编程:玩转select语句
Go并发编程:玩转select语句
161 0
Go并发编程:玩转select语句
go 缓冲区循环 以及 select选择
go 缓冲区循环 以及 select选择
126 0

热门文章

最新文章