2012-04-07 6 views
0
で.GOソースファイルと同じディレクトリにあるファイル

ソースファイル$ PWD/DIR/src.goに私は

os.Open("myfile.txt") 

を使用これは正常に見える)。

Goに、src.goと同じディレクトリにあるmyfile.txtを探すように指示する方法はありますか? Rubyに__FILE__のようなものが必要です。

答えて

5

Goはソースファイルと同じ場所にあるファイルを探すのに意味がありません。 goバイナリがコンパイルされ、バイナリが実行されるためにソースファイルが存在する必要はありません。そのため、GOはFILEと等価ではありません。 runtime.Caller関数は、バイナリのコンパイル時にファイル名を返します。

実際にこの機能を望んでいた理由を理解していれば、私たちはより良いアドバイスをすることができました。

+0

えええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええ回答回答者: – Blacksad

+1

おそらく、あなたのアプリケーションのためのコンベンションを設定し、そこから実行する場所を基準にしてファイルをロードしたいだけです。 flagsパッケージを使用して、ファイルがコマンドライン上のどこにあるかを伝えてください。 –

+0

はい、そうです。ありがとう! – Blacksad

0

可能代替スケルトン:

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

詳細here

+0

おかげでjnml、私はruntime.Callerを知りませんでした。私はファイルをロードする方法に関するJeremyのアドバイスに続いてしまったが、それは便利だ。 – Blacksad

0

使用パッケージosext

それはどこ現在実行中のプログラムの実行可能ファイルをフォルダへの絶対パスを返す関数ExecutableFolder()を提供していますが(cronジョブに便利)に存在します。それはクロスプラットフォームです。

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) 
} 

また、(__FILE__に類似)の完全な実行可能ファイルのパスを取得することができます:

package main 

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

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