В nodejs я использую __dirname . Что эквивалентно этому на Голанге?
Я гуглил и обнаружил эту статью http://andrewbrookins.com/tech/golang-get-directory-of-the-current-file/ . Где он использует приведенный ниже код
_, filename, _, _ := runtime.Caller(1)
f, err := os.Open(path.Join(path.Dir(filename), "data.csv"))
Но это правильный или идиоматический способ сделать на Голанге?
0
, а не1
, чтобыruntime.Caller()
.runtime.Caller(0)
даст вам путь к исходному файлу, как$GOPATH/src/packagename/main.go
. Другие ответы в этой теме пытаются вернуть путь к исполняемому файлу (например$GOPATH/bin/packagename
).Ответы:
Это должно сделать это:
источник
_, currentFilePath, _, _ := runtime.Caller(0)
dirpath := path.Dir(currentFilePath)
(обратите внимание наruntime.Caller(0)
вместоruntime.Caller(1)
)РЕДАКТИРОВАТЬ: Начиная с Go 1.8 (выпущен в феврале 2017 года) рекомендуемый способ сделать это с
os.Executable
:Чтобы получить только каталог исполняемого файла, который вы можете использовать
path/filepath.Dir
.Пример :
СТАРЫЙ ОТВЕТ:
Вы должны быть в состоянии использовать
os.Getwd
Например:
источник
runtime.Caller
вы ближе всего к "идиоматическим"path/filepath.Dir
потому чтоpath.Dir
работает только с косыми чертами (стиль Unix) в качестве разделителей каталогов.Используйте пакет osext
Он предоставляет функцию,
ExecutableFolder()
которая возвращает абсолютный путь к папке, в которой находится исполняемый в данный момент исполняемый файл программы (полезно для заданий cron). Это кроссплатформенная.Интернет документация
источник
go run main.go
для локальной разработки. Не уверен, как лучше обойти это, не создавая исполняемый файл заранее каждый раз.go run
. Эти двоичные файлы помещаются во временную папку каждый раз.go install
затем запуститьgo build -v *.go && ./main
. Он-v
скажет вам, какие файлы создаются. Вообще, я обнаружил, что время отличаетсяgo run
иgo build
терпимо, если я уже бегалgo install
. Для пользователей Windows на PowerShell эта команда будетgo build -v {*}.go && ./main.exe
$GOPATH/bin/
, почему бы не использовать$GOPATH/bin/
?Как указано в комментарии, возвращается каталог, который в данный момент активен.
источник
если вы используете этот способ:
вы получите путь / tmp при запуске программы с использованием некоторой IDE, такой как GoLang, потому что исполняемый файл будет сохраняться и запускаться из / tmp
Я думаю, что лучший способ получить текущий рабочий каталог или "." является :
os.Getwd () функция возвращает текущий рабочий каталог. и все это без использования какой-либо внешней библиотеки: D
источник
Если вы используете пакет osext от kardianos и вам нужно тестировать локально, как прокомментировал Дерек Даулинг:
Решением этой проблемы является создание утилиты gorun.exe вместо использования go run. Утилита gorun.exe скомпилирует проект, используя «go build», а затем сразу же запустит его в обычном каталоге вашего проекта.
У меня была эта проблема с другими компиляторами, и я обнаружил, что создаю эти утилиты, так как они не поставляются вместе с компилятором ... это особенно непонятно с такими инструментами, как C, где вам нужно скомпилировать и связать, а затем запустить его (слишком много работы).
Если кому-то нравится моя идея gorun.exe (или elf), я, скорее всего, скоро выложу его на github.
Извините, этот ответ подразумевается как комментарий, но я не могу комментировать, потому что у меня пока недостаточно высокая репутация.
В качестве альтернативы, «go run» можно изменить (если он еще не имеет этой функции), чтобы иметь такой параметр, как «go run -notemp», чтобы не запускать программу во временном каталоге (или что-то подобное). Но я бы предпочел просто набрать gorun или «gor», так как он короче запутанного параметра. Gorun.exe или gor.exe должны быть установлены в том же каталоге, что и ваш компилятор go
Реализация gorun.exe (или gor.exe) была бы тривиальной, как я сделал это с другими компиляторами всего в нескольких строках кода ... (известные последние слова ;-)
источник
_, callerFile, _, _ := runtime.Caller(0)
executablePath := filepath.Dir(callerFile)
вместо этогоos.Executable
: https://tip.golang.org/pkg/os/#Executablefilepath.EvalSymlinks
: https://golang.org/pkg/path/filepath/#EvalSymlinksПолная демонстрация:
источник
Иногда этого достаточно, первым аргументом всегда будет путь к файлу
источник
Ответ Густаво Нимейера великолепен. Но в Windows, время выполнения proc в основном в другом каталоге, например:
Если вы используете относительный путь к файлу, как
"/config/api.yaml"
, это будет использовать путь вашего проекта, где ваш код существует.источник