No nodejs eu uso __dirname . Qual é o equivalente disso em Golang?
Pesquisei no Google e descobri este artigo http://andrewbrookins.com/tech/golang-get-directory-of-the-current-file/ . Onde ele usa o código abaixo
_, filename, _, _ := runtime.Caller(1)
f, err := os.Open(path.Join(path.Dir(filename), "data.csv"))
Mas é o caminho certo ou idiomático para fazer em Golang?
0
, não1
pararuntime.Caller()
.runtime.Caller(0)
lhe dará o caminho do arquivo de origem, como$GOPATH/src/packagename/main.go
. As outras respostas neste segmento estão tentando retornar o caminho do executável (como$GOPATH/bin/packagename
).Respostas:
Isso deve servir:
fonte
_, currentFilePath, _, _ := runtime.Caller(0)
dirpath := path.Dir(currentFilePath)
(note aruntime.Caller(0)
vez deruntime.Caller(1)
)EDIT: A partir do Go 1.8 (Lançado em fevereiro de 2017), a maneira recomendada de fazer isso é
os.Executable
:Para obter apenas o diretório do executável, você pode usar
path/filepath.Dir
.Exemplo :
RESPOSTA ANTIGA:
Você deve poder usar
os.Getwd
Por exemplo:
fonte
runtime.Caller
é o mais próximo que você vai chegar ao "idiomático"path/filepath.Dir
porquepath.Dir
funciona apenas com barras (estilo Unix) como separadores de diretório.Use o pacote osext
Ele está fornecendo uma função
ExecutableFolder()
que retorna um caminho absoluto para a pasta onde reside o executável do programa atualmente em execução (útil para tarefas cron). É multiplataforma.Documentação online
fonte
go run main.go
desenvolvimento local. Não tenho certeza da melhor maneira de contornar isso sem criar previamente um executável a cada vez.go run
. Esses binários são colocados em uma pasta temporária a cada vez.go install
e depois executargo build -v *.go && ./main
. O-v
diria quais arquivos estão sendo criados. Geralmente, descobri que o tempo é diferentego run
ego build
tolerável se eu já tiver executadogo install
. Para usuários do Windows no powershell, o comando serágo build -v {*}.go && ./main.exe
$GOPATH/bin/
, por que não usar$GOPATH/bin/
?Conforme declarado no comentário, isso retorna o diretório que está ativo no momento.
fonte
se você usar desta maneira:
você obterá o caminho / tmp quando estiver executando um programa usando algum IDE como o GoLang, porque o executável salvará e executará em / tmp
Eu acho que a melhor maneira de obter o diretório de trabalho atual ou '.' é :
a função os.Getwd () retornará o diretório de trabalho atual. e tudo isso sem o uso de qualquer biblioteca externa: D
fonte
Se você usa o pacote osext da kardianos e precisa testar localmente, como comentou Derek Dowling:
A solução para isso é criar um utilitário gorun.exe em vez de usar go run. O utilitário gorun.exe compila o projeto usando "go build" e depois o executa no diretório normal do seu projeto.
Eu tive esse problema com outros compiladores e me vi criando esses utilitários, pois eles não são fornecidos com o compilador ... é especialmente arcano com ferramentas como C, nas quais você precisa compilar e vincular e depois executá-lo (muito trabalho).
Se alguém gostar da minha idéia do gorun.exe (ou elf), provavelmente o carregarei no github em breve ..
Desculpe, esta resposta é um comentário, mas não posso comentar porque ainda não tenho uma reputação grande o suficiente.
Como alternativa, "go run" pode ser modificado (se já não tiver esse recurso) para ter um parâmetro como "go run -notemp" para não executar o programa em um diretório temporário (ou algo semelhante). Mas eu preferiria apenas digitar gorun ou "gor", pois é mais curto que um parâmetro complicado. Gorun.exe ou gor.exe precisaria ser instalado no mesmo diretório do seu compilador go
A implementação de gorun.exe (ou gor.exe) seria trivial, como fiz com outros compiladores em apenas algumas linhas de código ... (famosas últimas palavras ;-)
fonte
_, callerFile, _, _ := runtime.Caller(0)
executablePath := filepath.Dir(callerFile)
vezos.Executable
: https://tip.golang.org/pkg/os/#Executablefilepath.EvalSymlinks
: https://golang.org/pkg/path/filepath/#EvalSymlinksDemonstração completa:
fonte
Às vezes isso é suficiente, o primeiro argumento sempre será o caminho do arquivo
fonte
A resposta de Gustavo Niemeyer é ótima. Mas no Windows, o proc de tempo de execução está principalmente em outro diretório, como este:
Se você usar o caminho relativo do arquivo, como
"/config/api.yaml"
, isso usará o caminho do projeto onde seu código existe.fonte