2014-07-05 7 views
10

je 2 fichiers gogolang variable indéfinie

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

package main 

import "fmt" 

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

et le fichier/Users/nom d'utilisateur/go/src /Test/src/main/someFile.go

package main 

const SomeVar = "someFile" 

Cependant j'obtiens constamment erreur du compilateur

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

Quelqu'un peut-il m'expliquer pourquoi SomeVar labeld est indéfini?

+2

Comment invoquez-vous le compilateur? ? Si vous avez lancé 'go build Test.go', alors il ne considérera qu'un fichier comme faisant partie du paquet. –

+0

1. Utilisez 'go build' - go run est vraiment idéal uniquement pour les programmes de fichiers simples. 2. N'appelez pas le dossier 'principal'. – elithrar

+0

Montrez votre $ GOPATH s'il vous plaît – 0xAX

Répondre

11

Essayez

go run Test.go someFile.go 
10

Quote:

Je pense que vous êtes mal compris comment l'outil fonctionne go. Vous pouvez faire "aller build" dans un répertoire, et il va construire le paquet entier (un paquet est défini comme tous les fichiers .go dans un répertoire). Même pour aller installer, allez test, etc Go course est le seul qui vous oblige à spécifier fichiers spécifiques ... il est vraiment destiné uniquement à être utilisé sur les très petits programmes , qui ont généralement besoin d'un seul fichier.

Alors faire:

go build && ./program_name 

See also

+0

@staticx: Il fournit une explication de l'erreur et une solution. Il fournit une réponse à la question. – peterSO

+1

Maintenant, c'est le cas. Votre message est apparu dans la file d'attente de faible qualité. – Brian

+0

Cela m'a aidé! Je courais dans ce problème en essayant d'exécuter mon grand programme à Gogland. Je l'ai corrigé en allant dans les configurations d'exécution et en changeant le type de projet en répertoire! – Shadoninja

3

code Vous est correct:

  • someFile.go et Test.go appartiennent au même ensemble (main)
  • SomeVar est un const déclaré au plus haut niveau, il a une portée de bloc de paquet, à savoir la portée de bloc de paquet main
  • en conséquence, SomeVar est visible et peut être consulté dans les deux fichiers

(si vous avez besoin d'examen de la portée dans Go, veuillez vous référer au Language Specification - Declarations and Scope).

Pourquoi obtenez-vous une erreur undefined alors?

Vous avez probablement lancé go build Test.go ou go run Test.go, à la fois produire la sortie suivante, si lancé à partir /Users/username/go/src/Test/src/main:

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

Vous pouvez trouver la raison ici: Command go

Si vous lancez go build ou go run une liste des fichiers .go, il les traite comme une liste de fichiers source spécifiant un seul paquet, c'est à dire, il pense qu'il n'y a pas d'autres morceaux de code dans le paquet main, d'où le erro r. La solution est notamment tous les requis .go fichiers:

go build Test.go someFile.go 

go run Test.go someFile.go 

go build également travailler sans argument, la construction de tous les fichiers qu'il trouve dans le paquet en conséquence:

go build 

Note 1 : les commandes ci-dessus font référence au package local et, en tant que telles, doivent être lancées à partir du répertoire /Users/username/go/src/Test/src/main

Note 2: bien que d'autres réponses aient déjà proposé des solutions valides, j'ai décidé d'ajouter quelques détails ici pour aider la communauté, puisque c'est une question courante quand vous commencez à travailler avec Go :)