从不同调用者的相对路径读取文件

Mar*_*ler 13 go

我正在尝试从项目目录中的文件中读取。

我的问题是,根据调用者的不同,路径会发生变化。调用者发生了变化,因为我想对这段代码进行单元测试,而调用者不再是了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),这显然也取决于调用者。

是否可以独立于调用函数获取项目根路径?还是我的代码设计有问题?我应该将文件路径传递给函数吗?

Dan*_*van 9

从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文件中引用此代码。