标签:case break send golang switch 循环 select
最近在测试服务器的 UDP 接口, 最开始我使用 python 协程制造负载, 但是单机负载一直不高. 刚好最近在学习 golang 相关的内容, 就用 golang 实现了一个 UDP 施压的程序. 在编写 golang 程序的过程中经常要用到 goroutine 与 channel. 读取 channel 中的内容是阻塞的, 而且官方似乎没有给出相关的超时处理, 因此需要程序员做相关的超时处理. 一般用 select + time.After() 进行超时处理. 代码如下:
func main() {
go sendToMain()
for {
fmt.Println("run for")
//两个 case. 一个是从管道里面读数据, 另一个是 0.5s 执行.
//当 0.5 秒内未在第一个 case 读取数据时执行第二个 case.
select {
case send_data := <-send_to_main: // 阻塞直到管道可读
fmt.Println("run send_data := <-send_to_main case")
switch send_data {
case 1:
fmt.Println("1")
default:
continue
}
case <-time.After(500 * time.Millisecond): // 0.5s 后管道还不可读则执行这个 case
fmt.Println("run <-time.After(500 * time.Millisecond) case")
break
}
}
}
运行之后我发现 switch 里的 continue 可以跳出本次循环, 但是 select 里的 break 只会结束本次循环, 并不会跳出最外层的 for 循环, 难道外循环还需要些循环控制相关的逻辑吗? 查询相关资料后我发现并不用, 只需在 for 循环上加一个标签, break 到这个标签即可. 代码如下:
var send_to_main = make(chan int)
func sendToMain() {
for i := 0; i < 10; i++ {
send_to_main <- i
time.Sleep(1 * time.Second) //阻塞 1 秒
}
}
func main() {
go sendToMain()
SELECT:
for {
fmt.Println("run for")
//两个 case. 一个是从管道里面读数据, 另一个是 0.5s 执行.
//当 0.5 秒内未在第一个 case 读取数据时执行第二个 case.
select {
case send_data := <-send_to_main: // 阻塞直到管道可读
fmt.Println("run send_data := <-send_to_main case")
switch send_data {
case 1:
fmt.Println("1")
default:
// continue SELECT
continue
}
case <-time.After(500 * time.Millisecond): // 0.5s 后管道还不可读则执行这个 case
fmt.Println("run <-time.After(500 * time.Millisecond) case")
break SELECT
}
}
}
我刚刚接触 golang 写的比较简陋, 园里的大佬肯定有更好的方法, 希望各位大佬不吝赐教.
标签:case,break,send,golang,switch,循环,select 来源: https://www.cnblogs.com/fishAndSea/p/16258306.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。