Come posso "eseguire" un progetto con più file nel pacchetto principale?


150

Al momento ho un singolo file nel mio pacchetto principale chiamato main.go. Come divido il contenuto di main.goin più file senza creare un pacchetto separato perché il codice non è riutilizzabile.

Voglio una struttura di directory come questa:

$ ls foo

main.go
bar.go

bar.go

package main

import "fmt"

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

Quindi dentro main.go

package main

func main() {
    Bar()
}

Ma go run main.gomi dà:

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

Risposte:


204

Aggiornamento 26 luglio 2019 (per andare> = 1.11)

go run .

Risposta originale

Il codice sopra funziona davvero. Il problema era che dovevo correre

go run *.go

invece di

go run main.go

6
A meno che tu non abbia *_test.gonella tua cartella. Quindi è necessario (1) shopt -s ext globe (2) go run !(*_test).go.
getWeberForStackExchange

e che dire di quelli che usano appengine?
goodies4uall

Ho provato go run ./cmd/myCmd/...e ha funzionato per me. Forse questo è il modo corretto quando ci sono _test.gofile?
VinGarcia,

go run ../your_folderdall'interno della cartella di lavoro funziona per me
Andy,

3
Basta farego run .
BarthesSimpson il

66

Aggiornamento agosto 2018, con Go 1.11 , una sezione "Esegui" indica:

Il go runcomando ora consente un singolo percorso di importazione, un nome di directory o un modello corrispondente a un singolo pacchetto.
Ciò consente go run pkgo go run dir, soprattuttogo run .


Risposta originale gennaio 2015

Come accennato in " Come compilare il programma Go costituito da più file? ", Si go runaspetta un elenco di file, poiché "compila ed esegue il mainpacchetto comprendente i file di origine Go".
Quindi puoi certamente dividere il tuo mainpacchetto in più file con go run.

Ciò differisce dal go build/go installquale aspettarsi i nomi dei pacchetti (e non i nomi dei file).
Un semplice go buildprodurrebbe un eseguibile che prende il nome dalla cartella principale.

Si noti che, come illustrato da questo thread , a go run *.gonon funzionerebbe in una sessione CMD di Windows, poiché la shell non esegue l'espansione jolly .


1
Esiste una soluzione alternativa per l'esecuzione di più file go con l' runutilizzo del prompt dei comandi di Windows?
Luca,

1
Grazie! Questo mi ha aiutato moltissimo. Continuavo a chiedermi perché non potevo semplicemente eseguire il codice con solo main.go dato che era lo stesso pacchetto, ma in un certo senso ha senso per me perché non lo hanno permesso.
Chris,

5

Come accennato, puoi dire go run *.goma per Windows puoi semplicemente elencare i file di script (poiché * .go non funzionerà) -go run main.go other.go third.go


Sì, è corretto. In Windows ho dovuto correrego run .
KTM

3

Secondo me, la migliore risposta a questa domanda è nascosta nei commenti alla risposta migliore.

Esegui questo:

go run .

Questo eseguirà tutti i file nel pacchetto principale, ma non darà un messaggio di errore simile

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

Complimenti a @BarthesSimpson


0

Per Windows installa Cygwin e usalo al posto del prompt dei comandi. "go run * .go" funzionerà quindi.


Suggerirei MinGW per questo, ma l'approccio è giusto se me lo chiedi. Dubito che qualcuno possa essere davvero emotivamente attaccato alcmd.exe
Aleksandr Kravets

0

Se si sta tentando di eseguire più file su localhost utilizzando gorilla mux, andare all'ultima versione (1.11). Prova a utilizzare uno dei seguenti 2 comandi.

  1. vai installa && FolderName -port 8081.

  2. vai a costruire && ./FolderName -port 8081.

Assicurarsi di trovarsi nella cartella di origine, ad esempio go / src / FolderName prima di eseguire il comando nel Terminale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.