去,是否有可能推迟sub func

时间:2016-12-03 22:34:45

标签: go deferred-execution

是否可以将defer置于子功能中?

即,对于func test1()中的第12~16行 https://play.golang.org/p/evabhcjvNs(见下文)

有没有可能把它们放在子功能中? 就像我在test2()中尝试的那样(但这种行为与test1()不同)。

我问的原因是,对于func test1()的第12~16行,我的实际代码是从持久数据中恢复变量,然后使用defer来保存test1() 1}}完成了。但是,有些情况下整个恢复/保存不是必需的,所以我正在考虑一种更好的方法来控制它。

感谢

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
}

1 个答案:

答案 0 :(得分:5)

我想我明白你在问什么。您想知道函数是否可以在调用者的延迟堆栈上放置函数。答案是否定的。一种可能的解决方案是让想要推迟某些功能的函数返回给调用者并让调用者执行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() }
}