gpt4 book ai didi

go - Go 中的文件路径

转载 作者:IT王子 更新时间:2023-10-29 02:27:58 26 4
gpt4 key购买 nike

这是 Mark Summerfield 的《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() 函数的情况下运行这段代码时,它运行得非常好。如果我把它留在里面,我会得到这个错误:

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() 函数没有从适当的目录中抓取文件?

最佳答案

您在 init 函数中更改变量 britishAmerican。如果没有 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)
}
}

它(当然)可以更短,但这应该足以让社区中的其他人看到发生了什么。

关于go - Go 中的文件路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28209006/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com