写点什么

Go 语言获取程序各类资源的绝对路径的方法

用户头像
良少
关注
发布于: 2020 年 05 月 02 日

路径问题

开发程序时,如果写死各类资源文件的路径,那么如果部署环境中的路径和开发环境不同,程序就无法正确工作。

为了解决这个问题,需要动态获取程序中各类资源的绝对路径。这样,不论程序被部署在什么地方,都可以正确读取各类资源文件。

各种编程语言,都有一些技巧可以获取程序各类资源的绝对路径的方法。本文要介绍的,是Go语言的相关技巧。

设计思路

我们可以通过在程序运行时,计算出程序的绝对路径,从而得到程序所在目录的绝对路径,进而获取程序各类资源的绝对路径。

我八年前写过一篇文章《Python怎样得到资源文件的绝对路径》,就是在Python中利用这个思路,实现了动态获得资源文件的绝对路径。

Go语言获取程序各类资源的绝对路径的方法

在Go语言的init()或者main() 函数中,调用下面这个Go语言函数,就能获取程序根目录的绝对路径。

func GetProjectAbsPath() (projectAbsPath string) {
programPath, _ := filepath.Abs(os.Args[0])
fmt.Println("programPath:", programPath)
projectAbsPath = path.Dir(path.Dir(programPath))
fmt.Println("PROJECT_ABS_PATH:", projectAbsPath)
return projectAbsPath
}

注意: 这里我假设Go语言的程序放在程序根目录下的bin目录下。因此需要通过获取两层目录来获得程序根目录的绝对路径。

Go语言比较奇特的一点是,main函数是没有参数的。在任何代码中都可以通过os.Args获取程序的参数。因此,利用这一点,我们不需要在main函数中获取程序根目录的绝对路径,而是可以在init函数中,在更早的时机就可以获得程序根目录的绝对路径。



然后,我们就可以通过下面的方法可以获取各类资源的绝对路径。

BinPathPrefix = ProjectAbsPath + "/bin/"

上面的代码在跨平台上有点问题。在类Unix系统上是正确的,在Windows上,路径会有问题。因为Windows的路径符号是\而不是/。

更好的代码应该如下所示。

BinPathPrefix = filepath.Join(ProjectAbsPath, "bin")

这样,我们就可以编写出不依赖写死的绝对路径的Go语言程序了。再不用因为开发、测试和部署环境的Go语言程序放置位置不同不能正常运行而烦恼了。我们编写出的Go语言程序可以简单发布为绿色软件:直接把Go语言程序压缩后,随便客户解压在什么位置下都可以正确运行。



发布于: 2020 年 05 月 02 日阅读数: 122
用户头像

良少

关注

余好读书,乐思善疑,常攥文以记之。 2018.11.13 加入

编程很多年了,大部分软件技术都会^_^

评论

发布
暂无评论
Go语言获取程序各类资源的绝对路径的方法