39

I compile a program with Go for various platforms and run it by calling a relative path or just by its name (if it is in the PATH variable).

Is it possible to find out where the executable is?

Say, my program is called "foo(.exe)". I can run ./foo, foo (if it's in the PATH), ../../subdir/subdir/foo.

I have tried to use os.Args[0] and I guess I should check if the program name contains something different besides "foo". If yes, use filepath.Abs, if no, use (I can't find the function name, there is a function that looks through the PATH to check where the program is).

Jonathan Hall
  • 75,165
  • 16
  • 143
  • 189
topskip
  • 16,207
  • 15
  • 67
  • 99

3 Answers3

48

You can use os.Executable for getting executable path on Go 1.8 or above version.

import (
    "os"
    "path"
    "log"
)

func main() {
    ex, err := os.Executable()
    if err != nil { log.Fatal(err) }
    dir := path.Dir(ex)
    log.Print(dir)
}
iamdual
  • 1,251
  • 14
  • 11
46

Use package osext.

It's providing function Executable() that returns an absolute path to the current program executable. It's portable between systems.

Online documentation

package main

import (
    "github.com/kardianos/osext"
    "fmt"
)

func main() {
    filename, _ := osext.Executable()
    fmt.Println(filename)
}
Dobrosław Żybort
  • 1,424
  • 12
  • 11
4

This is not go-specific (unless the go "standard library" contains some function to do it), and there is no portable solution. For solutions on some common platforms, see e.g. How do I find the location of the executable in C? or Finding current executable's path without /proc/self/exe .

Community
  • 1
  • 1
janneb
  • 36,249
  • 2
  • 81
  • 97