2012-04-07 18 views
0

打開文件時出現在源文件$ PWD/DIR/src.go我用在同一目錄下。去源文件中去

os.Open("myfile.txt") 

它看起來的myfile.txt在$ PWD(這看起來很正常)。

是否有辦法告訴Go在與src.go相同的目錄中查找myfile.txt?我需要在Ruby中使用類似__FILE__的東西。

回答

5

Go不是一種解釋型語言,因此在與源文件相同的位置查找文件沒有任何意義。 go二進制文件被編譯,並且源文件不需要存在,二進制文件就可以運行。因爲Go沒有與FILE等效。 runtime.Caller函數在編譯二進制文件時返回文件名。

我想也許如果我們明白爲什麼你真的想要這個功能,我們可以更好地爲你提供建議。

+0

好的答案......實際上,我的Go程序需要從外部文件加載數據,並且我想確保它能夠找到它們,而不必設置這些文件的絕對路徑。 – Blacksad 2012-04-08 01:17:37

+1

也許你只是想爲你的應用程序設置一個約定,並讓它加載相對於它運行的文件。或使用標誌包,並告訴它在命令行上的文件的位置。 – 2012-04-08 01:35:40

+0

是的,你是對的。謝謝 ! – Blacksad 2012-04-08 01:53:35

0

有可能取代骨架:

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

詳細here

+0

感謝jnml,我不知道runtime.Caller。我最終根據Jeremy關於如何加載我的文件的建議,但這很有用。 – Blacksad 2012-04-08 01:54:26

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