我正在尝试从项目目录中的文件中读取。
我的问题是,根据调用者的不同,路径会发生变化。调用者更改,因为我想对此代码进行单元测试,调用者不再是Main.go
。
这就是我的项目结构:
我尝试访问specialChars.txt
的代码如下所示:
func RemoveSpecialChars(word string) string {
file, err := ioutil.ReadFile("wordlists/specialChars.txt")
[...]
}
此代码适用于从Main.go
开始,但不适用于从CleanupUtil_test.go
开始。为了让它在测试中运行,我需要file, err := ioutil.ReadFile("../wordlists/specialChars.txt")
我找到了这样的答案:https://stackoverflow.com/a/32163888/2837489
_, filename, _, ok := runtime.Caller(0)
显然也取决于来电者。
是否可以使项目根路径独立于调用函数? 或者我的代码设计错了吗?我应该将文件路径传递给函数吗?
答案 0 :(得分:1)
将文件路径作为参数传递给函数(如上一个问题所示)。
更多详情:
相对路径"wordlists/specialChars.txt"
实际上并不依赖于源文件的位置(例如Main.go
或CleanupUtil_test.go
),而是取决于您执行它的位置。所以你可以从你的根目录运行你的测试,然后它实际上会工作。简而言之,当前的工作目录是相关的。
不过,我建议指定路径,因为这样可以使您的功能更具可重用性和通用性。
也许您甚至不需要将此信息放入文件中,但可以只包含包含这些字符的字符串。在这种情况下,您还可以检查https://golang.org/pkg/regexp/#Regexp.ReplaceAll是否已涵盖您的用例。