gpt4 book ai didi

closures - 我如何在 Go 中使用 Filepath.Walk?

转载 作者:IT老高 更新时间:2023-10-28 13:03:57 24 4
gpt4 key购买 nike

filepath.Walk 函数采用函数回调。这是没有上下文指针的直接函数。当然,Walk 的一个主要用例是遍历一个目录并基于它采取一些行动,并引用更广泛的上下文(例如,将每个文件输入到一个表中)。

如果我在 C# 中编写此代码,我将使用一个对象(具有可以指向上下文中的对象的字段)作为回调(具有给定的回调方法),以便对象可以封装 Walk 调用自。

(编辑:用户“usr”表明闭包方法也出现在 C# 中)

如果我在 C 中编写此代码,我会要求一个函数和一个上下文指针作为 void *,因此该函数有一个上下文指针,它可以传递到 Walk 函数并将其传递给回调函数。

但 Go 只有函数参数,没有明显的上下文指针参数。

(如果我设计了这个函数,我会把一个对象作为回调而不是一个函数,符合接口(interface) FileWalkerCallback 或其他什么,然后放一个 callback(.. .) 该接口(interface)上的方法。然后,消费者可以在将对象传递给 Walk 之前将任何上下文附加到对象。)

我能想到的唯一方法是在回调函数中捕获外部函数的闭包。以下是我的使用方法:

func ScanAllFiles(location string, myStorageThing *StorageThing) (err error) {
numScanned = 0

// Wrap this up in this function's closure to capture the `corpus` binding.
var scan = func(path string, fileInfo os.FileInfo, inpErr error) (err error) {
numScanned ++

myStorageThing.DoSomething(path)
}

fmt.Println("Scan All")

err = filepath.Walk(location, scan)

fmt.Println("Total scanned", numScanned)

return
}

在本例中,我创建了回调函数,因此它的闭包包含变量 numScannedmyStorageThing

这对我来说是错误的。我认为这感觉很奇怪是对的,还是我只是习惯了写 Go? filepath.Walk 方法的使用目的是为了让回调引用更广泛的上下文?

最佳答案

你这样做是对的。您可以考虑两种小变化。一种是您可以用下划线替换未使用参数的名称。因此,在您仅使用路径的示例中,签名可以读取

func(path string, _ os.FileInfo, _ error) error

它节省了一点打字,清理了一点代码,并清楚地表明您没有使用该参数。此外,特别是对于小型函数,通常跳过将函数文字分配给变量,而直接将其用作参数。您的代码最终会读取,

err = filepath.Walk(location, func(path string, _ os.FileInfo, _ error) error {
numScanned ++

myStorageThing.DoSomething(path)
})

这稍微清理了作用域,清楚地表明您只使用了一次闭包。

关于closures - 我如何在 Go 中使用 Filepath.Walk?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11336048/

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