You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
$ go run count_time.go
100 runs ave time: 5.26ms, max time 10.18ms
100 runs ave time: 6.03ms, max time 10.19ms
100 runs ave time: 5.75ms, max time 10.19ms
100 runs ave time: 6.06ms, max time 10.31ms
100 runs ave time: 5.62ms, max time 10.19ms
100 runs ave time: 5.52ms, max time 10.20ms
100 runs ave time: 5.82ms, max time 10.19ms
100 runs ave time: 5.61ms, max time 10.19ms
100 runs ave time: 5.41ms, max time 10.19ms
100 runs ave time: 6.24ms, max time 10.19ms
在A Tour of Go看到这样一段代码:
上述代码执行结果:
官方是这么解释的:
记得之前在面试某团的时候面试官一直问我闭包的定义,当时只知道这个东西怎么定义,如何使用,概念没答上来,后来特意搜了一下,wikipedia是这么说的:
有这样一个需求:我要测试一个服务的平均响应时间、最大响应时间,每100次输出一次结果。
一般我们会这样写:
执行结果示例
上面的代码在功能方面是没有问题的,但是服务和统计代码混合到一块,看起来比较乱。程序也不方便复用,如果有其他类似的统计又要再写一次,比较麻烦。
看看用闭包如何实现类似的功能:
这里我们定义了一个
NewTimeCount
函数,这个函数的参数是每隔printCount
输出一次统计结果。函数内部包含了timeTotal
、timeMax
、timeCount
三个变量,在函数内部又定义了一个匿名函数来做我们的统计工作,我们需要每次将timeCost
参数传递给这个匿名函数,执行匿名函数的时候,计数器自动加一,时间总数,最大时间自动自动更新,到我们设定的timeCount
之后自动输出并清零。timeTotal
、timeMax
、timeCount
这三个变量在NewTimeCount
之外是不可见的,可以认为是匿名函数的全局变量。再看一下
main
函数,比之前清晰了好多,这里我们是每100
次输出一次结果,我们可以通过NewTimeCount
来生成多个计数器来做统计,代码可重用行和可读性都比之前的代码要好很多。这里还有一个问题是要计算
TimeCost
,对首次使用的人来说可能不不清楚如何计算。如果程序再简化一些,将计算TimeCost
也自动化的话就方便多了。可以这样做:这次我们修改了
NewTimeCount
函数,让其返回两个函数,一个函数用来指定程序的起始时间,另一个来指定终止时间并统计和输入。main
函数得到更进一步简化。如果将
testService
作为参数传入的话代码可以更进一步简化:总的来说,闭包这个功能还是比较实用的。
The text was updated successfully, but these errors were encountered: