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() }
}
是否可以将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() }
}