go语言的相对路径问题

芒涯无涯 · 收录于 2023-06-03 04:27:02 · source URL

go语言同时支持“相对路径”和"绝对路径",但是在使用"相对路径"时候,会遇到一些令人意外的问题,所以接下来分别讨论两种使用"相对路径"的场景,并对规则进行总结

  • 在编译go项目时,比如go rungo buildgo install,会需要给出源文件路径和生成的可执行二进制目标文件相对路径
  • 在go代码中想要创建或打开一个文件时,需要给出文件的相对路径

场景一

在执行命令时,如果给的是相对命令,则会在三个路径下查找文件(如果是整个项目,则对应到文件夹),以go build main.go(等价于go build ./main.go,)为例,会在下面三条路径下查找文件进行编译,如果找不到则报错。其他命令如go rungo install类似

  • pwd + /main.go
  • $GOROOT + /src +/main
  • $GOPATH + /src + /main

场景二

比如GO Web项目中,会包含配置文件、静态文件、模板文件等资源,我们会将其编译为可执行二进制文件,然后部署到远程服务器运行,所以不能使用绝对路径,只能使用相对路径
当运行该程序时候,会以该文件所在位置为起点(并不是以项目根路径为起点),根据相对路径下查找,所以将可执行二进制文件放在不同路径下或部署到远程服务器后可能会导致服务启动失败
当在Goland中运行或者调试项目时候,默认是以项目根路径为起点的,所以如果相对路径为以项目根路径为起点的相对路径,可以正常运行
解决方法:关于包“path/filepath”,这个包处理路径相关的兼容问题,提供了处理路径的一系列方法,但是不适用于Web场景下。这里的问题是因为编译后的二进制可执行文件不会包含资源,所以需要将资源复制到对应目录下