3

我一直在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 中运行。

有没有办法做这个跨平台?

注意。具体来说, args[0] 取决于二进制文件的调用方式;在某些情况下,它只是二进制文件本身,例如。“app”或“app.exe”;所以你不能只使用它。

4

2 回答 2

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
}
于 2013-04-19T08:27:20.167 回答
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())
}
于 2013-04-19T04:15:28.027 回答