我想知道是否有任何惯用的方式来表示scoped语义。我所说的范围是指:
- 范围互斥体(一个衬垫而不是显式锁定+延迟解锁),
- 记录函数(或任何代码块)的入口和出口,
- 测量执行时间。
前两个项目符号的示例代码:
package main
import "log"
import "sync"
func Scoped(m *sync.Mutex) func() {
m.Lock()
return func() {
m.Unlock()
}
}
func Log(what string) func() {
log.Println(what, "started")
return func() {
log.Println(what, "done")
}
}
func main() {
defer Log("testing")()
m := &sync.Mutex{} // obviously mutex should be from other source in real life
defer Scoped(m)()
// use m
}
https://play.golang.org/p/33j-GrBWSq https://play.golang.org/p/33j-GrBWSq
基本上我们需要进行一个函数调用just now(例如互斥锁),并且应该推迟一个调用以延迟(例如互斥锁解锁)。我建议在这里只返回未命名的函数,但它可以很容易地命名(返回带有函数字段的结构)。
只有一个问题:用户可能会忘记“调用”第一次调用的结果。
这段代码是(可以是)惯用的吗?
将匿名函数视为scope:
func() {
Entrance()
defer Exit()
// anything you want to do in this scope
}()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)