gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 03:32:14 26 4
gpt4 key购买 nike

我看到很多在函数内部使用 defer func() 的例子。有没有办法避免在不同的地方重复它并像普通函数一样调用它?

在此示例(以及许多其他示例)中,延迟函数嵌套在另一个函数中:

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() 之外,以便其他函数也可以使用它?

最佳答案

您可以推迟任何功能。该函数的定义位置并不重要。

这是完全有效的:

func foo() {
// Do foo
}


func bar() {
defer foo()
// Do something before foo
}

func baz() {
defer foo()
// Do something else before foo
}

但在这种情况下,每次调用 bar()baz() 时,都会调用一次 foo()。它不是“共享的”,除非您不必多次重写匿名函数。

可能最常见的例子是在 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 调用的函数可以从多个地方调用。

关于go - 单个 defer func() 可以被其他函数共享吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57533985/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com