2 回答
TA贡献1900条经验 获得超5个赞
您britishAmerican在 init 函数中更改变量。如果没有init(),程序会在当前目录中查找(没有给出路径,只有文件名)。使用init(),它会在可执行文件所在的路径中查找 ( os.Args[0])。使用go run main.go,可执行文件所在的目录不是当前工作目录。
您应该使用go build来构建二进制文件然后运行它,或者您应该告诉我们您想要实现的目标(如@RoninDev 所写)。
我提到的 MCVE 可能如下所示:
package main
import (
"io/ioutil"
"log"
"os"
"path/filepath"
)
var filename = "foo.txt"
func init() {
// change to true and things break
if false {
dir, _ := filepath.Split(os.Args[0])
filename = filepath.Join(dir, filename)
}
}
func main() {
// requires a file 'foo.txt' in the current directory
_, err := ioutil.ReadFile(filename)
if err != nil {
log.Fatal(err)
}
}
它(当然)可以更短,但这应该足以让社区中的其他人了解正在发生的事情。
TA贡献1799条经验 获得超8个赞
在我看来,程序british-american.txt
需要在可执行文件所在的目录中调用一个文件。
这就是其中的代码init()
所做的 - 它找到可执行文件的路径并构造一个相对于该字典的路径。
我可以从您的错误消息中看到您go run
用于运行代码。这会生成一个临时可执行文件/tmp
并运行它。如果您将init()
代码保留在其中,它将在/tmp
目录中查找字典,但不会找到它。如果你把init()
代码拿出来,它会在当前目录中查找字典,它会成功。
如果你想按照作者的意图使用它,那么使用它go build
来构建一个二进制文件然后运行它 - 这会起作用。
- 2 回答
- 0 关注
- 299 浏览
添加回答
举报