2012-04-07 3 views
0

Если в исходном файле $ PWD/реж/src.go Я используюОткрыть файл в том же каталоге, что и исходный файл .go в Go

os.Open("myfile.txt") 

он ищет myfile.txt в $ PWD (который выглядит нормально).

Есть ли способ сказать Перейти к файлу myfile.txt в том же каталоге, что и src.go? Мне нужно что-то вроде __FILE__ в Ruby.

ответ

5

Go не является интерпретированным языком, поэтому поиск файла в том же месте, где исходный файл не имеет никакого смысла. Бинарный файл go компилируется, и исходный файл не обязательно должен присутствовать для запуска двоичного файла. Из-за этого Go не поставляется с эквивалентом FILE. Функция runtime.Caller возвращает имя файла во время компиляции двоичного файла.

Я думаю, что, возможно, если бы мы поняли, почему вы действительно хотели эту функциональность, мы могли бы вам посоветовать лучше.

+0

Хороший ответ ... На самом деле моя программа Go должна загружать данные из внешних файлов, и я хочу быть уверенным, что она их найдет, без необходимости устанавливать абсолютный путь к этим файлам. – Blacksad

+1

Возможно, вы просто хотите установить соглашение для своего приложения и загрузить его файлы относительно того, откуда он работает. или используйте пакет флагов и сообщите ему, где находятся файлы в командной строке. –

+0

Да, ты прав. Благодаря ! – Blacksad

0

Возможным заменителем скелет:

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

Подробности here.

+0

Благодаря jnml, я не знаю runtime.Caller. Я закончил следовать совету Джереми относительно загрузки моих файлов, но это полезно. – Blacksad

0

Использование пакета osext

Это функция ExecutableFolder(), которая возвращает абсолютный путь к папке обеспечения, где в настоящее время работает программа исполняемым Reside (полезно для хрон рабочих мест). Это кросс-платформа.

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) 
} 
Смежные вопросы