Como posso "executar" um projeto com vários arquivos no pacote principal?


150

Atualmente, tenho um único arquivo no meu pacote principal chamado main.go. Como dividir o conteúdo main.goem vários arquivos sem criar um pacote separado, porque o código não é reutilizável.

Eu quero uma estrutura de diretórios como esta:

$ ls foo

main.go
bar.go

bar.go

package main

import "fmt"

func Bar() {
    fmt.Println("Bar")
}

Então em main.go

package main

func main() {
    Bar()
}

Mas go run main.gome dá:

# command-line-arguments
./main.go:4:2: undefined: Bar

Respostas:


204

Atualização 26 de julho de 2019 (para ir> = 1.11)

go run .

Resposta original

O código acima realmente funciona. O problema era que eu precisava correr

go run *.go

ao invés de

go run main.go

6
A menos que você tenha *_test.gona sua pasta. Então você precisa (1) shopt -s ext globe (2) go run !(*_test).go.
getWeberForStackExchange

e os que usam o appengine?
goodies4uall

Eu tentei go run ./cmd/myCmd/...e funcionou para mim. Talvez esta seja a maneira correta quando houver _test.goarquivos?
VinGarcia 27/03

go run ../your_folderde dentro da pasta de trabalho funciona para mim
Andy

3
Apenas façago run .
BarthesSimpson

66

Atualize agosto de 2018, com o Go 1.11 , uma seção "Executar" declara:

O go runcomando agora permite um único caminho de importação, um nome de diretório ou um padrão correspondente a um único pacote.
Isso permite go run pkgou go run dir, o mais importantego run .


Resposta original Jan. 2015

Como mencionado em " Como compilar o programa Go que consiste em vários arquivos? ", go runEspera uma lista de arquivos, pois "compila e executa o mainpacote que compreende os arquivos de origem Go nomeados".
Então você certamente pode dividir seu mainpacote em vários arquivos comgo run .

Isso difere do go build/go installque se espera nomes de pacotes (e não nomes de arquivos).
Um simples go buildproduziria um executável com o nome da pasta pai.

Observe que, conforme ilustrado por este encadeamento , um go run *.gonão funcionaria em uma sessão do Windows CMD, pois o shell não faz expansão de curinga .


1
Existe uma solução alternativa para executar vários arquivos go runusando o prompt de comando do Windows?
Lucas

1
Obrigado! Isso me ajudou muito. Fiquei me perguntando por que eu não poderia simplesmente executar o código com apenas main.go, já que era o mesmo pacote, mas meio que faz sentido para mim o porquê de eles não permitirem isso.
22418 Chris

5

Como mencionado, você pode dizer, go run *.gomas no Windows, basta listar os arquivos de script (já que * .go não funcionará) -go run main.go other.go third.go


Sim esta correto. No windows eu tive que corrergo run .
KTM

3

Na minha opinião, a melhor resposta a esta pergunta está oculta nos comentários da resposta superior.

Basta executar isso:

go run .

Isso executará todos os arquivos no pacote principal, mas não emitirá uma mensagem de erro como

go run: cannot run *_test.go files (main_test.go)

Parabéns a @BarthesSimpson


0

No Windows, instale o Cygwin e use-o em vez do prompt de comando. "vá correr *. go" funcionará então.


Eu sugeriria o MinGW para isso, mas a abordagem é correta se você me perguntar. Eu duvido que qualquer um poderia ser muito emocionalmente ligado acmd.exe
Aleksandr Kravets

0

Se você estiver tentando executar vários arquivos no host local usando o gorilla mux em go, conforme a versão mais recente (1.11). Tente usar qualquer um dos 2 comandos a seguir.

  1. vá para instalar && FolderName -port 8081.

  2. vá compilar && ./FolderName -port 8081.

Verifique se você está na pasta de origem, ou seja, vá / src / FolderName antes de executar o comando no Terminal.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.