Je suis un nouveau venu à aller. J'aime beaucoup le langage, mais je me suis vite rendu compte que je devais commencer à diviser mes fichiers en raison de l’augmentation de la taille du programme.
go run main.go
(avec main.go ayant été le fichier avec ma fonction main ())
cela ne fonctionnait pas et je me suis heurté à une barrière pendant un moment, parce que je ne savais pas comment faire fonctionner mon programme.
Quelques recherches rapides me conduisent à la réponse de
go run main.go other.go ..
où en tapant tous les fichiers qui composent mon package main
, je pourrais faire fonctionner la programmation. Cependant, cette tâche est extrêmement lourde et frustrante à chaque fois.
J'écris la question suivante à réponse spontanée afin d'empêcher d'autres personnes comme moi-même de se heurter à nouveau à cette barrière.
As Nate Finch notes:
Go run est ... vraiment destiné à être utilisé sur de très petits programmes, qui ne nécessitent généralement qu'un seul fichier.
Même sous unix, go run *.go
est souvent incorrect. Dans tout projet avec des tests unitaires (et chaque projet doit avoir des tests unitaires), ceci donnera l'erreur:
go run: cannot run *_test.go files (something_test.go)
Il ignorera également les restrictions de construction, de sorte que les fichiers _windows.go
seront compilés (ou tenteront de l'être) sous Unix, ce qui n'est pas ce que vous voulez.
Il y a eu un peu de discussions pour faire en sorte que go run
fonctionne comme le reste des commandes go
, et il existe un CL ouvert pour cela ( 5164 ). C'est actuellement à l'étude pour Go 1.4. En attendant, la solution recommandée sur toutes les plateformes est la suivante:
go build && ./<executable>
Systèmes liés à Unix
go run *.go
sera suffisant dans la plupart des cas.
Continuez à la méthode ci-dessous si cela provoque des erreurs.
Systèmes Windows (et dans d'autres cas où go run *.go
ne fonctionne pas)
L’expansion des jetons ne fonctionne pas dans la ligne de commande de Windows et par conséquent, ce qui précède ne fonctionnera pas et n’affichera pas d’erreur. go run *.go
peut également ne pas fonctionner dans les systèmes d'exploitation dans certains cas en raison des limites actuelles du compilateur.
Dans ces cas, utilisez
go build && foo.exe
où foo.exe
est le nom du fichier .exe produit . Si vous n'avez peut-être aucune idée du nom de votre exécutable, commencez par
go build
et vérifiez le nom du fichier .exe produit. Ensuite, utilisez la méthode qui inclut le nom du fichier.
Ces 2 méthodes vont construire et exécuter tous les fichiers .go de votre répertoire actuel avec un minimum de tracas.
La meilleure façon de le faire est de l'exécuter comme ceci:
go run !(*_test).go
Il ignore tous vos fichiers de test, ce qui est exactement ce dont vous avez besoin pour éviter l'erreur.
L'autre suggestion:
go build && ./<executable>
est un peu ennuyeux. Vous devez supprimer l'exécutable tout le temps pour éviter d'être marqué par git. Vous pouvez le mettre dans gitignore, bien sûr, mais je suis paresseux et ceci est une étape supplémentaire.
Vous pouvez exécuter tous les fichiers .go
, à l'exception des tests, en utilisant cette construction bash:
go run $(ls -1 *.go | grep -v _test.go)
Si je comprends bien votre question, vous devez importer un autre code en tant que bibliothèques.
Petit exemple
./testing/main.go:
package main
import "fmt"
import L "testing/lib"
func main() {
fmt.Println("Hello from main()")
L.Somefunc()
}
./testing/lib/somelib.go:
package lib
import "fmt"
func Somefunc() {
fmt.Println("Hello from Somefunc()")
return
}
Pour lancer - go run main.go
juste utiliser ceci
go run *.go
cela fonctionnera en supposant que vous n'avez pas de fichiers de test
Voici ma solution:
go run $(find . -name "*.go" -and -not -name "*_test.go" -maxdepth 1)
Je l'utilise avec un alias pour faciliter l'exécution d'applications en ligne de commande
alias gorun='go run $(find . -name "*.go" -and -not -name "*_test.go" -maxdepth 1)'
$ gorun param1 param2
Sur Windows, j’ai d’habitude ajouté un peu test.bat à tous les répertoires de mon projet:
go build
.\{project_name}.exe
go clean
Fonctionne assez bien. Remplacez {nom_projet} par le nom de votre exécutable, bien entendu. Et une fois l'exécutable terminé, le script de traitement par lots passe au nettoyage.
Pour window, les travaux suivants: Ouvrez cmd et accédez au chemin où se trouve votre dossier. Puis tapez la commande suivante et appuyez sur Entrée.
go build
après celui-ci sera créé un exécutable. Dans la commande Invite, appelez l'exécutable . Si votre nom d'exécutable est Project.exe, tapez ce qui suit et appuyez sur Entrée:
Project.exe
Pour les personnes essayant d'utiliser go run
combiné avec go generate
, une solution peut être:
//go:generate sh -c "go run path/*.go"
Enfin, nous pouvons maintenant utiliser:
go run .
grâce à: https://github.com/golang/go/issues/22726#issuecomment-345841019