2014-07-05 8 views
10

ho 2 file goGolang undefined variabile

/Users/username/go/src/Test/src/main/Test.go

package main 

import "fmt" 

func main() { 
    fmt.Printf(SomeVar) 
} 

e file/Users/nomeutente/go/src /Test/src/main/someFile.go

package main 

const SomeVar = "someFile" 

Comunque sono costantemente ottenendo errore del compilatore

/Users/username/go/src/Test/src/main/Test.go:6: undefined: SomeVar 

Qualcuno può spiegarmi perché SomeVar è etichettato come non definito?

+2

Come stai invocando il compilatore ? Se esegui 'go build Test.go', allora considererà solo un file come parte del pacchetto. –

+0

1. Usa 'go build' - go run è davvero l'ideale solo per semplici programmi di file singoli. 2. Non chiamare la cartella 'principale'. – elithrar

+0

Mostra il tuo '$ GOPATH 'per favore – 0xAX

risposta

11

Prova

go run Test.go someFile.go 
10

Quote:

Credo che tu stia equivoco come funziona lo strumento movimento. È possibile eseguire "go build" in una directory e verrà creato l'intero pacchetto (un pacchetto è definito come tutti i file .go in una directory). Lo stesso vale per l'installazione go, il test , ecc. Go run è l'unico che richiede di specificare i file specifici ... in realtà è pensato solo per essere utilizzato su programmi molto piccoli , che generalmente richiedono solo un singolo file.

in modo da fare:

go build && ./program_name 

See also

+0

@staticx: fornisce una spiegazione dell'errore e una soluzione. Fornisce una risposta alla domanda. – peterSO

+1

Ora sì. Il tuo post è apparso nella coda di bassa qualità. – Brian

+0

Questo mi ha aiutato! Mi sono imbattuto in questo problema cercando di eseguire il mio grande programma in Gogland. L'ho risolto andando alle configurazioni di corsa e passando il tipo di progetto alla directory! – Shadoninja

3

codice Si è corretto:

  • someFile.go e Test.go appartengono allo stesso pacchetto (main)
  • SomeVar è un 012.dichiarato al livello più alto, quindi ha un campo di applicazione blocco del pacchetto, vale a dire il main pacchetto di blocchi portata
  • di conseguenza, SomeVar è visibile e si può accedere in entrambi i file

(se avete bisogno di rivedere scoping in Go, fare riferimento allo Language Specification - Declarations and Scope).

Perché viene visualizzato un errore undefined?

Probabilmente lanciato go build Test.go o go run Test.go, sia producendo il seguente output, se lanciato da /Users/username/go/src/Test/src/main:

# command-line-arguments 
./Test.go:6: undefined: SomeVar 

È possibile trovare il motivo qui: Command go

Se si avvia go build o go run con una lista dei file .go, li considera come un elenco di file sorgente che specificano un singolo pacchetto, cioè, pensa che non ci siano altri pezzi di codice nel pacchetto main, quindi l'erro r. La soluzione è inclusi tutti i necessari .go file:

go build Test.go someFile.go 

go run Test.go someFile.go 

go build funziona anche senza argomenti, la costruzione di tutti i file che trova nel pacchetto di conseguenza:

go build 

Nota 1 : i comandi sopra riportati si riferiscono al pacchetto locale e, come tale, devono essere avviati dalla directory

Nota 2: sebbene altre risposte abbiano già proposto soluzioni valide, ho deciso di aggiungere qualche altro dettaglio qui per aiutare la comunità, poiché questa è una domanda comune quando inizi a lavorare con Go :)