Go 中的文件路径

这是 Mark Summerfield 编写的 Programming in Go 中的示例。


package main


import (

"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 不从适当的目录中获取文件?


噜噜哒
浏览 301回答 2
2回答

梵蒂冈之花

您britishAmerican在 init 函数中更改变量。如果没有init(),程序会在当前目录中查找(没有给出路径,只有文件名)。使用init(),它会在可执行文件所在的路径中查找 ( os.Args[0])。使用go run main.go,可执行文件所在的目录不是当前工作目录。您应该使用go build来构建二进制文件然后运行它,或者您应该告诉我们您想要实现的目标(如@RoninDev 所写)。我提到的 MCVE 可能如下所示:package mainimport (    "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)    }}它(当然)可以更短,但这应该足以让社区中的其他人了解正在发生的事情。

守着星空守着你

在我看来,程序british-american.txt需要在可执行文件所在的目录中调用一个文件。这就是其中的代码init()所做的 - 它找到可执行文件的路径并构造一个相对于该字典的路径。我可以从您的错误消息中看到您go run用于运行代码。这会生成一个临时可执行文件/tmp并运行它。如果您将init()代码保留在其中,它将在/tmp目录中查找字典,但不会找到它。如果你把init()代码拿出来,它会在当前目录中查找字典,它会成功。如果你想按照作者的意图使用它,那么使用它go build来构建一个二进制文件然后运行它 - 这会起作用。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go