Go,是否可以将 defer 放在子函数中

Go, is it possible to put defer in sub func

是否可以将defer放在子函数中?

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

有没有可能把它们放在子函数中? 就像我在 test2() 中尝试的那样(但该行为不同于 test1())。

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

谢谢

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
}

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