其他函数可以共享单个defer func()吗?

时间:2019-08-17 06:51:26

标签: go error-handling

我看到了很多在函数内部使用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()之外,以便其他功能也可以使用它?

1 个答案:

答案 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调用的函数可以在多个地方调用。