Golang中如何获取目录路径
Golang中如何获取目录路径 我有以下文件夹结构 -app –api —service —templates
如何在 service 文件夹内获取 templates 中的文件?在一个函数中,我需要提供 templates 内文件的路径,但当我在 service 文件夹内尝试类似这样的操作时:
"../templates/"
它不起作用。
3 回复
另外,如果你指的是导入语句,请使用完整的包名(import "github.com/example/repo/app/api/templates")。
func main() {
fmt.Println("hello world")
}
更多关于Golang中如何获取目录路径的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
记住当前工作目录。另外,你打算如何分发可执行文件?那时当前工作目录可能与你的源文件夹结构无关。
你可能需要将资源存储在某个地方,并使用基于配置/xdg 基本目录规范来找到它。
在Go中获取相对路径时,工作目录是关键因素。以下是几种在service中获取templates目录路径的解决方案:
1. 使用绝对路径(推荐)
package main
import (
"path/filepath"
"runtime"
)
func getTemplatesPath() string {
_, filename, _, _ := runtime.Caller(0)
serviceDir := filepath.Dir(filename)
templatesDir := filepath.Join(serviceDir, "../templates")
return templatesDir
}
2. 使用工作目录
package main
import (
"os"
"path/filepath"
)
func getTemplatesPath() (string, error) {
wd, err := os.Getwd()
if err != nil {
return "", err
}
// 假设当前工作目录是项目根目录
templatesDir := filepath.Join(wd, "api/templates")
return templatesDir, nil
}
3. 使用嵌入文件系统(Go 1.16+)
package main
import (
"embed"
"io/fs"
)
//go:embed api/templates/*
var templatesFS embed.FS
func readTemplateFile(filename string) ([]byte, error) {
return templatesFS.ReadFile("api/templates/" + filename)
}
4. 使用配置文件或环境变量
package main
import (
"os"
"path/filepath"
)
var templatesDir string
func init() {
// 从环境变量读取
if dir := os.Getenv("TEMPLATES_DIR"); dir != "" {
templatesDir = dir
} else {
// 默认路径
templatesDir = "./api/templates"
}
}
func getTemplatePath(filename string) string {
return filepath.Join(templatesDir, filename)
}
5. 完整示例
package main
import (
"fmt"
"io/ioutil"
"path/filepath"
"runtime"
)
func getTemplatesDir() string {
_, filename, _, _ := runtime.Caller(0)
serviceDir := filepath.Dir(filename)
return filepath.Join(serviceDir, "../templates")
}
func main() {
templatesDir := getTemplatesDir()
fmt.Printf("Templates目录: %s\n", templatesDir)
// 读取templates目录下的文件
files, err := ioutil.ReadDir(templatesDir)
if err != nil {
fmt.Printf("读取目录失败: %v\n", err)
return
}
for _, file := range files {
fmt.Printf("文件: %s\n", file.Name())
}
}
最可靠的方法是使用runtime.Caller(0)获取当前文件的绝对路径,然后基于此构建相对路径。这样可以确保无论程序从何处运行,都能正确找到templates目录。

