热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

golang基础chan的select操作、定时器操作、超时控制、goroutine中使用recover

chan的只读和只写chan的select操作





        • chan的只读和只写
        • chan的select操作
        • chan的定时器
        • 一次定时器
        • 超时控制
        • goroutine中使用recover


chan的只读和只写

a.只读chan的声明
Var 变量的名字 <-chan int
Var readChan <- chan int

b. 只写chan的声明
Var 变量的名字 chan<- int
Var writeChan chan<- int

chan的select操作

格式如下

Select {
case u :&#61; <- ch1:
case e :&#61; <- ch2:
default: }

看实例代码&#xff1a;

package main
import "fmt"
import "time"
func main() {
var ch chan int
ch &#61; make(chan int ,10)
ch2:&#61; make(chan int ,10)
go func(){
var i int
for {
ch <- i
time.Sleep(time.Second)
ch2 <- i * i
time.Sleep(time.Second)
i &#43;&#43;
}
}()
for {
select{
case v:&#61; <-ch:
fmt.Println(v)
case v:&#61; <-ch2:
fmt.Println(v)
default:
fmt.Println("get data timeout")
time.Sleep(time.Second)
}
}
}

输出如下&#xff1a;

PS E:\golang\go_pro\src\safly> go run demo.go
0
get data timeout
0
get data timeout
1
get data timeout
1
get data timeout
2
get data timeout
4
get data timeout
3
get data timeout
9
get data timeout
4
get data timeout
16
get data timeout
5
get data timeout
exit status 2
PS E:\golang\go_pro\src\safly>

chan的定时器

package main
import "fmt"
import "time"
/* type Ticker struct { C <-chan Time r runtimeTimer } */
func main() {
t :&#61; time.NewTicker(time.Second)
for v :&#61; range t.C {
fmt.Println("hello, ", v)
}
}

输出如下&#xff1a;

PS E:\golang\go_pro\src\safly> go run demo.go
hello, 2017-11-11 18:50:38.165007 &#43;0800 CST
hello, 2017-11-11 18:50:39.1652525 &#43;0800 CST
hello, 2017-11-11 18:50:40.165327 &#43;0800 CST
hello, 2017-11-11 18:50:41.1650873 &#43;0800 CST
exit status 2
PS E:\golang\go_pro\src\safly>

一次定时器

package main
import "fmt"
import "time"
/* func After(d Duration) <-chan Time { return NewTimer(d).C } */
func main() {
select {
case <- time.After(time.Second):
fmt.Println("after")
}
}

输出如下&#xff1a;

PS E:\golang\go_pro\src\safly> go run demo.go
after
PS E:\golang\go_pro\src\safly>

超时控制

package main
import "fmt"
import "time"
func queryDb(ch chan int) {
// time.Sleep(time.Second)
ch <- 100
}
func main() {
ch :&#61; make(chan int)
go queryDb(ch)
t :&#61; time.NewTicker(time.Second)
select {
case v :&#61; <-ch:
fmt.Println("result", v)
case <-t.C:
fmt.Println("timeout")
}
}

输出如下&#xff1a;

PS E:\golang\go_pro\src\safly> go run demo.go
result 100
PS E:\golang\go_pro\src\safly>

以上代码是没有超时的&#xff0c;我们将上面代码中 // time.Sleep(time.Second)注释去掉
就会输出如下的结果

PS E:\golang\go_pro\src\safly> go run demo.go
timeout
PS E:\golang\go_pro\src\safly>

goroutine中使用recover

应用场景&#xff0c;如果某个goroutine panic了&#xff0c;而且这个goroutine里面没有
捕获(recover)&#xff0c;那么整个进程就会挂掉。所以&#xff0c;好的习惯是每当go产
生一个goroutine&#xff0c;就需要写下recover

package main
import (
"fmt"
// "runtime"
"time"
)
func test() {
defer func() {
if err :&#61; recover(); err !&#61; nil {
fmt.Println("panic:", err)
}
}()
var m map[string]int
m["stu"] &#61; 100
}
func calc() {
for {
fmt.Println("i&#39;m calc")
time.Sleep(time.Second)
}
}
func main() {
go test()
for i :&#61; 0; i <2; i&#43;&#43; {
go calc()
}
time.Sleep(time.Second * 10000)
}

输出如下&#xff1a;

PS E:\golang\go_pro\src\safly> go run demo.go
i&#39;m calc
panic: assignment to entry in nil map
i&#39;m calc
i&#39;m calc
i&#39;m calc
i&#39;m calc
i&#39;m calc
i&#39;m calc
i&#39;m calc
exit status 2
PS E:\golang\go_pro\src\safly>

推荐阅读
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • Spring学习(4):Spring管理对象之间的关联关系
    本文是关于Spring学习的第四篇文章,讲述了Spring框架中管理对象之间的关联关系。文章介绍了MessageService类和MessagePrinter类的实现,并解释了它们之间的关联关系。通过学习本文,读者可以了解Spring框架中对象之间的关联关系的概念和实现方式。 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 面向对象之3:封装的总结及实现方法
    本文总结了面向对象中封装的概念和好处,以及在Java中如何实现封装。封装是将过程和数据用一个外壳隐藏起来,只能通过提供的接口进行访问。适当的封装可以提高程序的理解性和维护性,增强程序的安全性。在Java中,封装可以通过将属性私有化并使用权限修饰符来实现,同时可以通过方法来访问属性并加入限制条件。 ... [详细]
author-avatar
xuyuankeji_954
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有