目录1.基本语法2.select语句的实际应用在golang语言中,select语句 就是用来监听和channel有关的io操作,当IO操作发生时,触发相应的case动作。
在golang语言中,select语句 就是用来监听和channel有关的io操作,当IO操作发生时,触发相应的case动作。
有了 select语句,可以实现 main主线程 与 Goroutine线程 之间的互动。
select {
case <-ch1 : // 检测有没有数据可读
// 一旦成功读取到数据,则进行该case处理语句
case ch2 <- 1 : // 检测有没有数据可写
// 一旦成功向ch2写入数据,则进行该case处理语句
default:
// 如果以上都没有符合条件,那么进入default处理流程
}
注意事项
(1)多个IO操作发生时,case语句是随机执行的
func main() {
ch1 := make(chan int, 1) // 创建 一个长度带缓冲的整型通道
ch1 <- 1 // 向通道中写入数据
ch2 := make(chan int, 1)
ch2 <- 2
select {
case <- ch1:
fmt.Println("ch1 read")
case <- ch2:
fmt.Println("ch2 read")
}
}
多次执行后,会随机打印 “ch1 read” 或 “ch2 read”
(2)空select语句
func main() {
select {
}
}
执行后,引发死锁,打印如下:
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [select (no cases)]:
main.main()
xxx/test.go:4 +0x27
exit status 2
(3)for中的select 引起CPU资源消耗过高
func main() {
quit := make(chan bool)
go func() {
for {
select {
case <-quit:
fmt.Println("quit")
// 使用 return 就会退出整个goroutine线程;如果使用 break,程序仍然在for循环中执行
return
default:
fmt.Println("default")
}
}
}()
time.Sleep(3 * time.Second)
quit <- true // 主线程在3秒后,向quit信道写入数据
time.Sleep(2 * time.Second)
fmt.Println("main")
}
在for{}的select语句中使用了 default后,线程就会无限执行default条件,直到quit信道中读到数据,否则会一直在一个死循环中运行,从而导致占满整个CPU资源。
在 for{}的select语句中,不建议使用 default条件。
(1)实现 main主线程与 goroutine线程 之间的交互、通信
// 通过控制台输入 "bye", 来控制main函数结束运行
func main() {
quit := make(chan bool)
ch := make(chan string)
go func() {
for {
select {
case name := <-ch:
fmt.Printf("from main msg: [%v]\n", name)
if name == "bye" {
quit <- true
} else {
quit <- false
}
}
}
}()
for {
// 控制台输入
fmt.Print("please input string: ")
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
ch <- scanner.Text()
isOver := <- quit
if isOver {
break
}
}
fmt.Println("main over")
}
运行:
from main msg: [aaa]
please input string: bbb
from main msg: [bbb]
please input string: bye
from main msg: [bye]
main over
(2)超时实现
func main() {
quit := make(chan bool)
ch := make(chan int)
go func() {
for {
select {
case num := <- ch:
fmt.Println("num = ", num)
case <- time.After(5 * time.Second):
fmt.Println("超时")
quit <- true
}
}
}()
for i := 0; i < 2; i++ {
ch <- i
time.Sleep(time.Second)
}
<- quit // 等待超时后, 结束 main主线程
fmt.Println("程序结束")
}
到此这篇关于go语言中如何使用select的实现示例的文章就介绍到这了,更多相关go语言使用select内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
--结束END--
本文标题: go语言中如何使用select的实现示例
本文链接: https://lsjlt.com/news/148727.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-04-05
2024-04-05
2024-04-05
2024-04-04
2024-04-05
2024-04-05
2024-04-05
2024-04-05
2024-04-04
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0