我正在尝试从项目目录中的文件中读取。
我的问题是,根据调用者的不同,路径会发生变化。调用者发生了变化,因为我想对这段代码进行单元测试,而调用者不再是了Main.go。
这就是我的项目结构:
我尝试访问的代码specialChars.txt如下所示:
func RemoveSpecialChars(word string) string {
file, err := ioutil.ReadFile("wordlists/specialChars.txt")
[...]
}
Run Code Online (Sandbox Code Playgroud)
此代码适用于 start fromMain.go但不适用于 start from CleanupUtil_test.go。为了让它在测试中正常工作,我需要file, err := ioutil.ReadFile("../wordlists/specialChars.txt")
我找到了这样的答案: https: //stackoverflow.com/a/32163888/2837489
_, filename, _, ok := runtime.Caller(0),这显然也取决于调用者。
是否可以独立于调用函数获取项目根路径?还是我的代码设计有问题?我应该将文件路径传递给函数吗?
从Go 1.16开始,你可以使用embed包。这允许您将文件嵌入到正在运行的 go 程序中。需要注意的是,引用的目录需要存在于嵌入文件中或嵌入文件之下。在您的情况下,结构如下所示:
-- main.go
-- cleanup
-- wordlist
\- specialChars.txt
CleanupUtil.go
CleanupUtil_test.go
Run Code Online (Sandbox Code Playgroud)
您可以使用 go 指令引用该文件
// CleanupUtil.go
package cleanup
import (
"embed"
)
//go:embed wordlists/specialChars.txt
var content embed.FS
func RemoveSpecialChars(word string) string {
file, err := content.ReadFile("wordlists/specialChars.txt")
[...]
}
Run Code Online (Sandbox Code Playgroud)
无论程序在哪里执行,该程序都会成功运行。您应该能够在您的main.go文件和您的CleanupUtil_test.go文件中引用此代码。