go中的各种路径

假设有个a.go文件在/apis/app/account/

package main

import (
	"fmt"
	"os"
)

func main() {
	curWD, err := os.Getwd()
	if err != nil {
		panic(err)
	}

	fmt.Println(curWD)
}

1. os.Getwd()获取当前工作目录的路径

函数用于获取当前工作目录的路径,即程序在运行时所处的目录路径。具体来说,如果你的程序是在终端中运行的,那么当前工作目录通常是你在终端中所处的目录。如果你的程序是在IDE或其他开发环境中运行的,那么当前工作目录通常是IDE或开发环境所打开的项目目录。

如果你在/apis目录下执行/apis/app/account/a.go,那么os.Getwd()函数返回的当前工作目录的路径是/apis,因为在执行程序时,你的当前工作目录是/apis。这是因为在执行程序时,系统会将当前工作目录设置为程序所在的目录。

但是如果你在/apis/app/account目录下执行/apis/app/account/a.go,那么os.Getwd()函数返回的当前工作目录的路径是/apis/app/account,因为在执行程序时,你的当前工作目录是/apis/app/account

因此,当你执行os.Getwd()函数时,它将返回当前工作目录的路径,而不是程序的绝对路径。

因此对于想获取绝对路径来说它是变化的。

2. os.Executable()获取正在执行的二进制文件的路径

假设macos上面生成的二进制路径为:/apis/app/account/cmd/account/__debug_bin, 那么os.Executable()得到就是/apis/app/account/cmd/account/__debug_bin
 
假设linux上面生成的二进制路径为:/apis/app/account/bin/account, 那么os.Executable()得到就是/apis/app/account/bin/account
当然不同环境可以使用相对的路径,这里只是举例
 
因此对于想获取绝对路径来说它也是变化的。
 

3. runtime.Caller()获取Go文件在所在操作系统中的路径

要获取Go文件在所在操作系统中的路径,可以使用runtime.Caller()函数。该函数返回调用它的函数的文件名和行号,可以使用这些信息确定调用者的源代码文件的路径。

以下是一个示例代码,演示如何获取Go文件在所在操作系统中的路径:

package main

import (
	"fmt"
	"path/filepath"
	"runtime"
)

func main() {
	// 获取当前函数的信息
	_, filename, _, ok := runtime.Caller(0)
	if !ok {
		panic("Failed to get caller information")
	}

	// 获取Go文件的绝对路径
	goFilePath, err := filepath.Abs(filename)
	if err != nil {
		panic(err)
	}

	fmt.Println(goFilePath)
}

在这个示例代码中,runtime.Caller()函数返回当前函数的文件名和行号。通过将文件名与filepath.Abs()函数一起使用,可以获取当前Go文件的绝对路径。这种方法可以在不同的操作系统中使用,因为它使用了当前Go文件的实际路径,而不是正在执行的二进制文件的路径。

这个是绝对路径,不论操作系统怎么变化,不论bin处于哪个路径,都能正确获取当前文件所在的路径
posted @ 2023-07-06 11:08  若-飞  阅读(396)  评论(0)    收藏  举报