我一直在osx上使用这个功能:
// Shortcut to get the path to the current executable
func ExecPath() string {
var here = os.Args[0]
if !strings.HasPrefix(here, "/") {
here, _ = exec.LookPath(os.Args[0])
if !strings.HasPrefix(here, "/") {
var wd, _ = os.Getwd()
here = path.Join(wd, here)
}
}
return here
}
...但它非常混乱,它根本不适用于Windows,当然也不适用于Windows上的git-bash。
有没有办法做这个跨平台?
NB。具体来说,args [0]取决于如何调用二进制文件;在某些情况下,它只是二进制本身,例如。 “app”或“app.exe”;所以你不能只使用它。
答案 0 :(得分:4)
这是传统的做法,我认为它可以在任何平台下使用。
import (
"fmt"
"os"
"path/filepath"
)
// Shortcut to get the path to the current executable
func ExecPath() string {
var here = os.Args[0]
here, err := filepath.Abs(here)
if err != nil {
fmt.Printf("Weird path: %s\n", err)
}
return here
}
答案 1 :(得分:0)
我认为没有一种跨平台的方法可以做到这一点。
然而,在OS X上,有一种更好的方法。 dyld提供了一个函数_NSGetExecutablePath()
,它为您提供了可执行文件的路径。你可以用CGo调用它。
package main
// #import <mach-o/dyld.h>
import "C"
import (
"fmt"
)
func NSGetExecutablePath() string {
var buflen C.uint32_t = 1024
buf := make([]C.char, buflen)
ret := C._NSGetExecutablePath(&buf[0], &buflen)
if ret == -1 {
buf = make([]C.char, buflen)
C._NSGetExecutablePath(&buf[0], &buflen)
}
return C.GoStringN(&buf[0], C.int(buflen))
}
func main() {
fmt.Println(NSGetExecutablePath())
}