Comment puis-je «exécuter» un projet avec plusieurs fichiers dans le package principal?

150

J'ai actuellement un seul fichier dans mon package principal appelé main.go. Comment diviser le contenu de main.goen plusieurs fichiers sans créer de package séparé car le code n'est pas réutilisable.

Je veux une structure de répertoires comme celle-ci:

$ ls foo

main.go
bar.go

bar.go

package main

import "fmt"

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

Puis dans main.go

package main

func main() {
    Bar()
}

Mais go run main.gome donne:

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

Réponses:

204

Mise à jour du 26 juillet 2019 (pour aller> = 1.11)

go run .

Réponse originale

Le code ci-dessus fonctionne réellement. Le problème était que j'avais besoin de courir

go run *.go

au lieu de

go run main.go
Neil
la source
6
Sauf si vous avez *_test.godans votre dossier. Ensuite, vous devez (1) shopt -s ext globet (2) go run !(*_test).go.
getWeberForStackExchange
et qu'en est-il de ceux qui utilisent appengine?
goodies4uall du
J'ai essayé go run ./cmd/myCmd/...et cela a fonctionné pour moi. Peut-être que c'est la bonne façon quand il y a des _test.gofichiers?
VinGarcia
go run ../your_folderde l'intérieur du dossier de travail fonctionne pour moi
Andy
3
Just dogo run .
BarthesSimpson
66

Mise à jour d'août 2018, avec Go 1.11 , une section «Exécuter» indique:

La go runcommande autorise désormais un seul chemin d'importation, un nom de répertoire ou un modèle correspondant à un seul package.
Cela permet go run pkgou go run dir, surtoutgo run .


Réponse originale janvier 2015

Comme mentionné dans " Comment compiler un programme Go composé de plusieurs fichiers? ", go runAttend une liste de fichiers, car il "compile et exécute le mainpackage comprenant les fichiers source Go nommés".
Vous pouvez donc certainement diviser votre mainpackage en plusieurs fichiers avec go run.

Cela diffère des go build/go installnoms de packages attendus (et non des noms de fichiers go).
Un simple go buildproduirait un exécutable nommé d'après le dossier parent.

Notez que, comme illustré par ce fil , a go run *.gone fonctionnerait pas dans une session Windows CMD, car le shell ne fait pas d'expansion de caractères génériques .

VonC
la source
1
Existe-t-il une solution de contournement pour exécuter plusieurs fichiers go à l' runaide de l'invite de commande Windows?
Luke
1
Merci! Cela m'a beaucoup aidé. Je n'arrêtais pas de me demander pourquoi je ne pouvais pas simplement exécuter le code avec juste main.go puisqu'il s'agissait du même package, mais cela me semble logique de savoir pourquoi ils ne le permettaient pas.
Chris
5

Comme mentionné, vous pouvez dire, go run *.gomais pour Windows, vous pouvez simplement lister les fichiers de script (puisque * .go ne fonctionnera pas) -go run main.go other.go third.go

Karl Penzhorn
la source
Oui c'est correct. Dans Windows, je devais courirgo run .
KTM
3

À mon avis, la meilleure réponse à cette question est cachée dans les commentaires de la première réponse.

Exécutez simplement ceci:

go run .

Cela exécutera tous les fichiers du package principal, mais ne donnera pas de message d'erreur comme

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

Félicitations à @BarthesSimpson

chim
la source
0

Pour Windows, installez Cygwin et utilisez-le à la place de l'invite de commande. "go run * .go" fonctionnera alors.

Alex Dvoretskiy
la source
Je suggérerais MinGW pour cela, mais l'approche est juste si vous me le demandez. Je doute que quiconque puisse être vraiment émotionnellement attaché àcmd.exe
Aleksandr Kravets
0

Si vous essayez d'exécuter plusieurs fichiers sur localhost en utilisant gorilla mux, allez-y selon la dernière version (1.11). Essayez d'utiliser l'une des 2 commandes suivantes.

  1. allez installer && FolderName -port 8081.

  2. allez construire && ./FolderName -port 8081.

Assurez-vous que vous êtes dans le dossier source, c'est-à-dire go / src / FolderName avant d'exécuter la commande dans le terminal.

Bharat Kuppala
la source