登录
首页 >  Golang >  Go问答

不同环境下os.Getwd()不同时如何查找同级文件

来源:stackoverflow

时间:2024-04-06 13:18:35 444浏览 收藏

今日不肯埋头,明日何以抬头!每日一句努力自己的话哈哈~哈喽,今天我将给大家带来一篇《不同环境下os.Getwd()不同时如何查找同级文件》,主要内容是讲解等等,感兴趣的朋友可以收藏或者有更好的建议在评论提出,我都会认真看的!大家一起进步,一起学习!

问题内容

myprogram/
 |
 |-main.go
 |-dir1/
     |-data/
         |-datafile.json
     |-runner.go
     |-runner_test.go

runner.go 中,我有一个简单的函数来读取 datafile.json。类似的东西

   func getpayload() (string, err) {
            dbytes, derr := ioutil.readfile("dir1/data/datafile.json")
            if derr != nil { return nil, derr}
            return dbytes, nil
   }

我在 lambda 中使用 go,其结构与上面类似。当 lambda 在实际环境中运行时,它从 main.go 开始,然后从 runner.go 调用 getpayload()。但是,我在 runner_test.go 中的简单工作节点机器上进行了测试,该测试也命中了 getpayload()

在“正常”执行期间(来自 main.go)- 工作正常。但是,当从 runner_test.go 调用 getpayload() 时,会出错,并显示

打开dir1/data/datafile.json没有这样的文件或目录

这是有道理的,因为在测试过程中,工作目录是存放runner_test.go的目录,即data/,所以没有dir1作为它的子目录。我一直在尝试使用 os.getwd() 并从那里获取路径,例如:

   pwd, _ := os.Getwd()
   dBytes, dErr := ioutil.ReadFile(pwd + "dir1/data/datafile.json")

但同样,这不起作用,因为对于 runner_test.go 密码是 user/myname/myprogram/dir1,但从 main.go 来看,它显示为 user/myname/myprogram

知道如何在任何环境中从 getpayload() 中找到并打开 datafile.json 吗?我可以向 getpayload() 传递一个可选参数,但如果可能的话,最好避免这种情况。


正确答案


如果文件是静态的(意味着在构建程序后不需要更改),则可以将其嵌入到构建的程序中。这意味着您不再需要担心运行时文件路径。

import (
    "embed"
)

//go:embed data/*
var dataFiles embed.FS

func GetPayload() (string, err) {
    dBytes, dErr := dataFiles.ReadFile(dataFiles, "data/datafile.json")
    if dErr != nil { return nil, dErr}
    return dBytes, nil
}

现在,data/ 目录中的文件已嵌入到此变量 datafiles 中,该变量充当只读文件系统。

了解更多信息:

package documentation 概述中了解有关嵌入的更多信息。

阅读我关于 "when to use embed" 的回答

对于您的程序在运行时需要的数据文件,要么使用固定目录并引用它,要么接受命令行参数或某种配置来告诉您在哪里该文件是。

运行单元测试时,wd 是包含测试文件的目录。一种约定是在包含测试的目录下使用 testdata/ 目录,并将所有数据文件放在那里。这样您就可以使用 testdata/datafile.json 从测试中引用该文件。

您可以使用运行时所需文件的副本作为测试文件,也可以使用从运行时数据文件到 testdata/ 目录下的测试文件的符号链接。

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《不同环境下os.Getwd()不同时如何查找同级文件》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>