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

go rungo buildgo install

场景一

go build main.gogo build ./main.gogo rungo install
  • pwd + /main.go
  • $GOROOT + /src +/main
  • $GOPATH + /src + /main

场景二

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