我看到了很多在函数内部使用defer func()的示例。有没有办法避免在不同地方重复它并像正常函数一样调用它?
在此示例(以及许多其他示例)中,defer函数嵌套在另一个函数内部:
package main
import (
"fmt"
"os"
)
func main() {
defer func() {
if err := recover(); err != nil {
fmt.Fprintf(os.Stderr, "Exception: %v\n", err)
os.Exit(1)
}
}()
file, err := os.Open(os.Args[1])
if err != nil {
fmt.Println("Could not open file")
}
fmt.Printf("%v", file)
}
是否可以将defer func()移动到main()之外,以便其他功能也可以使用它?
答案 0 :(得分:2)
您可以推迟任何功能。定义该功能的位置并不重要。
这是完全有效的:
func foo() {
// Do foo
}
func bar() {
defer foo()
// Do something before foo
}
func baz() {
defer foo()
// Do something else before foo
}
但是在这种情况下,foo()
和bar()
的每次调用将一次调用baz()
。它不是“共享的”,只是在某种意义上,您不必多次重写匿名函数。
最常见的示例是在defer语句中调用Close()
:
func foo() error {
f, err := os.Open(...)
if err != nil {
return err
}
defer f.Close() // "Close()" is obviously not defined here
// do something with f
}
TL; DR;
您不能在各个函数之间共享defer
语句。但是与其他任何函数一样,defer
调用的函数可以在多个地方调用。