gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:51:01 25 4
gpt4 key购买 nike

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

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

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

我问的原因是,对于 func test1() 的第 12~16 行,我的实际代码是从持久数据中恢复变量,然后使用 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
}

最佳答案

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

关于Go,是否可以将 defer 放在子函数中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40953241/

25 4 0