良许Linux教程网 干货合集 讲解一下go特殊的关键字select

讲解一下go特殊的关键字select

select 是Go语言中常用的一个关键字,Linux再也早也引入了这个函数,用来实现非阻塞的一种方式,一个select语句用来选择哪个case中的发送或接收操作可以被立即执行。它类似于switch语句,但是它的case涉及到channel有关的I/O操作。

image-20220827215424769
select{
case case处理语句
case chan2 case处理语句
default:
// 如果上面都没有成功,则进入default处理语句
}
12345678

go有一个特殊的关键字select,它允许用户从多个通道中选择一个通道来接收。

package main

import (
   "fmt"
   "time"
)

func ping1 (c chan string){
   time.Sleep(time.Second*1)
   c "ping on channel1"
}

func ping2 (c chan string){
   time.Sleep(time.Second*2)
   c "ping on channel2"
}

func main(){
   channel1 := make(chan string)
   channel2 := make(chan string)
   go ping1(channel1)
   go ping2(channel2)
   select {
   case msg1 := "received",msg1)
   case msg2 := "received",msg2)
   case "no messages")
   }
}

如果先接收到channel1就先执行channel1分支,如果接收到channel2,就执行channel2分支,如果在规定的时间没有接收到消息,就会执行超时的分支。 程序调用内置的close函数关闭了通道,关闭通道并不会导致通道的机能完全停止,他的作用就是通知其他正在尝试从这个通道接收值的goroutine,这个通道已经不会再接受到任何值了。 case msg, ok1 =

package main

import (
   "fmt"
)

func callerA(c chan string) {
   c "hello world"
   close(c)
}

func callerB(c chan string) {
   c "hello zhangsan"
   close(c)
}

func main() {
   a, b := make(chan string), make(chan string)
   go callerA(a)
   go callerB(b)
   var msg string
   ok1, ok2 := truetrue
   for ok1 || ok2 {
       select {
       case msg, ok1 = if ok1 {
               fmt.Printf("%s from A\n", msg)
           }
       case msg, ok2 = if ok2 {
               fmt.Printf("%s from B\n", msg)
           }
       }
   }
}

以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !

137e00002230ad9f26e78-265x300
本文由 良许Linux教程网 发布,可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
良许

作者: 良许

良许,世界500强企业Linux开发工程师,公众号【良许Linux】的作者,全网拥有超30W粉丝。个人标签:创业者,CSDN学院讲师,副业达人,流量玩家,摄影爱好者。
上一篇
下一篇

发表评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部