Go 开始,可以在子功能中设置延迟吗

Go 开始,可以在子功能中设置延迟吗,go,deferred-execution,Go,Deferred Execution,是否可以将延迟放入子功能中 即,对于中functest1()的第12~16行 (附于下文) 是否有可能将它们放入子功能中? 就像我在test2()中尝试的那样(但这种行为不同于test1()) 我询问的原因是,对于functest1()的第12~16行,我的实际代码是从持久数据恢复变量,然后在test1()完成时使用defer保存它。但是,在某些情况下,整个恢复/保存是不必要的,因此我正在考虑一种更好的方法来控制它 谢谢 package main import "log" func main

是否可以将
延迟
放入子功能中

即,对于中func
test1()的第12~16行
(附于下文)

是否有可能将它们放入子功能中? 就像我在
test2()
中尝试的那样(但这种行为不同于
test1()

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

谢谢

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
}

我想我理解你的要求。您想知道函数是否可以将函数放在调用方的延迟堆栈上。答案是否定的。一个可能的解决方案是让想要延迟某个内容的函数将该函数返回给调用者,并让调用者执行
延迟
。例如:

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() }
}

我想我理解你的要求。您想知道函数是否可以将函数放在调用方的延迟堆栈上。答案是否定的。一个可能的解决方案是让想要延迟某个内容的函数将该函数返回给调用者,并让调用者执行
延迟
。例如:

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() }
}