xpt*_*xpt 1 go deferred-execution
可以放入defer子功能吗?
即,对于线12的FUNC〜16 test1()中
https://play.golang.org/p/evabhcjvNs(下面封闭)
是否有可能将它们置于子功能中?就像我尝试过的那样test2()(但这种行为不同于test1()).
我要问的原因是,对于func的第12~16行test1(),我的实际代码是从持久数据中恢复变量,然后defer在test1()完成时使用它来保存它.但是,有些情况下整个恢复/保存不是必需的,所以我正在考虑一种更好的方法来控制它.
谢谢
package main
import "log"
func main() {
test1()
log.Printf("==== \n")
test2()
}
func test1() {
r, err := Open("a")
if err != nil {
log.Fatalf("error opening 'a'\n")
}
defer r.Close()
r.Use()
}
func test2() {
r := subc()
r.Use()
}
func subc() *Resource {
r, err := Open("a")
if err != nil {
log.Fatalf("error opening 'a'\n")
}
defer r.Close()
return r
}
type Resource struct {
name string
}
func Open(name string) (*Resource, error) {
log.Printf("opening %s\n", name)
return &Resource{name}, nil
}
func (r *Resource) Use() error {
log.Printf("using %s\n", r.name)
return nil
}
func (r *Resource) Close() error {
log.Printf("closing %s\n", r.name)
return nil
}
Run Code Online (Sandbox Code Playgroud)
我想我明白你在问什么.您想知道函数是否可以在调用者的延迟堆栈上放置函数.答案是否定的.一种可能的解决方案是让想要推迟某些功能的函数返回给调用者并让调用者执行该操作defer.例如:
func test2() {
r, cleanup := subc()
defer cleanup()
r.Use()
}
func subc() (*Resource, func()) {
r, err := Open("a")
if err != nil {
log.Fatalf("error opening 'a'\n")
}
return r, func() { r.Close() }
}
Run Code Online (Sandbox Code Playgroud)