我们可以像在python中那样在Go中创建上下文管理器吗

我们可以像在python中那样在Go中创建上下文管理器吗,go,Go,在python中,我发现上下文管理器非常有用。我试着在围棋中找到同样的东西 e、 g: 其中open是python中处理入口和出口的上下文管理器,它隐式地负责关闭打开的文件 我们不是明确地这样做: f := os.Open("filename") //do something here defer f.Close() 在围棋中也能做到这一点吗?提前谢谢。不,你不能,但你可以用一个小包装器函数创造同样的幻觉: func WithFile(fname string, fn func(f *os.F

在python中,我发现上下文管理器非常有用。我试着在围棋中找到同样的东西

e、 g:

其中open是python中处理入口和出口的上下文管理器,它隐式地负责关闭打开的文件

我们不是明确地这样做:

f := os.Open("filename")
//do something here
defer f.Close()

在围棋中也能做到这一点吗?提前谢谢。

不,你不能,但你可以用一个小包装器函数创造同样的幻觉:

func WithFile(fname string, fn func(f *os.File) error) error {
    f, err := os.Open(fname)
    if err != nil {
        return err
    }
    defer f.Close()
    return fn(f)
}

实际上,我不仅仅是在寻找文件的打开和关闭。只是举个例子。寻找类似于python中的
\uuuuuuuuuuuuuuuuuuuuu
\uuuuuuuuuuuuuuuuuuuu
的内容。@Chinmay答案仍然是否定的,但是它不应该被转发,因为它并不总是保证运行。谢谢,将它标记为答案,可能您可以提供方法
WithFile
的用法来完成它。它以一种不太方便的形式存在,语法与Python不同。您可以在许多情况下使用它,而不是对
*os.File
对象使用特定的函数。也就是说,这个答案没有错,只是针对
*os.File
,因为这是原始问题的上下文。基本上,Go和Python之间的唯一区别在于,必须显式调用文件的
Close
方法,即使您
将调用推迟到函数退出。
func WithFile(fname string, fn func(f *os.File) error) error {
    f, err := os.Open(fname)
    if err != nil {
        return err
    }
    defer f.Close()
    return fn(f)
}