为了账号安全,请及时绑定邮箱和手机立即绑定

Go 中的文件路径

Go 中的文件路径

Go
噜噜哒 2021-09-13 14:41:22
这是 Mark Summerfield 编写的 Programming in Go 中的示例。package mainimport ("fmt""io/ioutil""os""path/filepath""strings")var britishAmerican = "british-american.txt"func init() {    dir, _ := filepath.Split(os.Args[0])    britishAmerican = filepath.Join(dir, britishAmerican)}func main() {    rawBytes, err := ioutil.ReadFile(britishAmerican)    if err != nil {        fmt.Println(err)    }    text := string(rawBytes)    usForBritish := make(map[string]string)    lines := strings.Split(text, "\n")    fmt.Println(lines)    for _, line := range lines {        fields := strings.Fields(line)        if len(fields) == 2 {            usForBritish[fields[0]] = fields[1]        }    }    fmt.Println(usForBritish)}当我在注释掉 init() func 的情况下运行此代码时,它运行良好。如果我把它留在我得到这个错误:open /var/folders/l6/rdqtyrfd303dw1cz8qvlfcvc0000gn/T/go-    build652175567/command-line-arguments/_obj/exe/british-american.txt: no     such file or directory exit status 1  我的问题是,为什么init()func 不从适当的目录中获取文件?
查看完整描述

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)

    }

}

它(当然)可以更短,但这应该足以让社区中的其他人了解正在发生的事情。


查看完整回答
反对 回复 2021-09-13
?
守着星空守着你

TA贡献1799条经验 获得超8个赞

在我看来,程序british-american.txt需要在可执行文件所在的目录中调用一个文件。

这就是其中的代码init()所做的 - 它找到可执行文件的路径并构造一个相对于该字典的路径。

我可以从您的错误消息中看到您go run用于运行代码。这会生成一个临时可执行文件/tmp并运行它。如果您将init()代码保留在其中,它将在/tmp目录中查找字典,但不会找到它。如果你把init()代码拿出来,它会在当前目录中查找字典,它会成功。

如果你想按照作者的意图使用它,那么使用它go build来构建一个二进制文件然后运行它 - 这会起作用。


查看完整回答
反对 回复 2021-09-13
  • 2 回答
  • 0 关注
  • 299 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信