2012-04-07 10 views

Antwort

5

Go ist keine interpretierte Sprache, daher ist die Suche nach einer Datei am selben Speicherort wie die Quelldatei nicht sinnvoll. Die Go-Binärdatei wird kompiliert, und die Quelldatei muss nicht vorhanden sein, damit die Binärdatei ausgeführt werden kann. Aus diesem Grund kommt Go nicht mit einem Äquivalent zu FILE. Die Funktion runtime.Caller gibt den Dateinamen zum Zeitpunkt der Kompilierung der Binärdatei zurück.

Ich denke vielleicht, wenn wir verstanden haben, warum Sie eigentlich diese Funktionalität wollten, könnten wir Sie besser beraten.

+0

Gute Antwort ... Eigentlich muss mein Go-Programm Daten von externen Dateien laden, und ich möchte sicher sein, dass es sie findet, ohne einen absoluten Pfad zu diesen Dateien festlegen zu müssen. – Blacksad

+1

Wahrscheinlich möchten Sie nur eine Konvention für Ihre App festlegen und die Dateien relativ dazu laden lassen, wo sie ablaufen. Oder verwenden Sie das Flags-Paket und teilen Sie ihm mit, wo sich die Dateien in der Befehlszeile befinden. –

+0

Ja, Sie haben Recht. Vielen Dank ! – Blacksad

0

Ein möglicher Ersatz Skelett:

func __FILE__() (fn string) { 
     _, fn, _, _ = runtime.Caller(0) 
     return 
} 

Einzelheiten here.

+0

Dank jnml, ich runtime.Caller nicht kannte. Ich folgte Jeremys Ratschlag, wie man meine Dateien lädt, aber das ist nützlich. – Blacksad

0

Verwenden Paket osext

Es bietet Funktion ExecutableFolder(), die einen absoluten Pfad zurück in den Ordner, wo das aktuell laufende Programm ausführbare reside (nützlich für Cron-Jobs). Es ist plattformübergreifend.

Online documentation

package main 

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

func main() { 
    folderPath, err := osext.ExecutableFolder() 
    if err != nil { 
     log.Fatal(err) 
    } 
    fmt.Println(folderPath) 
} 

Sie auch vollständige Pfad für ausführbare Dateien (ähnlich __FILE__) erhalten können:

package main 

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

func main() { 
    exeAbsolutePath, _ := osext.Executable() 
    fmt.Println(exeAbsolutePath) 
}