golang fonction «non définie» déclarée dans un autre fichier?

135

J'essaie d'écrire un programme go de base qui appelle une fonction sur un fichier différent, mais une partie du même package. Cependant, il renvoie:

undefined: NewEmployee

Voici le code source:

main.go:

package main

func main() {
emp := NewEmployee()    
}

employee.go:

package main

type Employee struct {
    name string
    age int
}   

func NewEmployee() *Employee {
    p := &Employee{}
    return p
}

func PrintEmployee (p *Employee)  {
    return "Hello world!"
}
Juan M
la source
vos fichiers ont-ils des instructions de package? Ce que vous avez tapé n'a pas de package x, et votre paquet principal ne contient généralement qu'un seul fichier, puis importe les autres éléments dont il a besoin
Chris Pfohl
8
utilisez-vous go run? (et voir golang.org/doc/code.html )
JimB
1
@JuanM, ma question était est-ce que la source complète de main.goet employee.go? Parce que tous les fichiers go sont censés avoir une instruction package, et je n'en vois aucune dans la vôtre. Voir: golang.org/doc/code.html#PackageNames
Chris Pfohl
1
La dernière fonction de employee.go est fausse (pas de nom de fonction, pas de type de retour déclaré). Ce n'est pas le problème que vous demandez, mais cela montre qu'il y a plus de problèmes. Pourriez-vous publier le code complet et l'erreur complète lors de la compilation?
siritinga
1
alors montrez-nous ce que vous faites! GOPATH, le code réel et la façon dont vous invoquez l' gooutil.
JimB

Réponses:

173

Veuillez lire "Comment écrire le code Go" .

Ne l'utilisez pas /srcdans votre GOPATH. Les packages sont situés dans $GOPATH/src.

Pour buildou installvous devez avoir vos fichiers dans un répertoire de package.

Pour go run, vous devez fournir tous les fichiers en argument:

go run main.go employee.go

Mais, vous devriez presque toujours utiliser go install, ou go build(et de préférence le premier, car cela go buildcrée de la confusion lorsque vous travaillez avec des packages non principaux)

JimB
la source
merci pour l'entrée @JimB! J'ai édité les variables d'environnement (j'avais également oublié de définir GOBIN), déplacé mes fichiers vers le bon emplacement, mais quand j'essaye d'aller installer, j'obtiens la même erreur. Aucune suggestion?
Juan M
Êtes-vous certain qu'il n'y a pas d'autres erreurs? Votre fichier employee.go ne peut pas être compilé tel quel. Sinon, j'ai besoin de voir exactement ce que vous faites. Chemins exacts, invocation, etc.
JimB
8
Ou do $ go run * .go
Puran
faire exécuter $ go run *.goserait un raccourci au lieu d'exécuter tous les fichiers
offerni
61

J'ai juste eu le même problème dans GoLand (qui est Intellij IDEA for Go) et j'ai trouvé une solution. Vous devez changer le Run kindde Fileà Packageou Directory. Vous pouvez le choisir dans une liste déroulante si vous allez dans Run/EditConfigurations.

Par exemple: pour le package ~/go/src/a_package, utilisez un Package pathde a_packageet un Directoryde ~/go/src/a_packageet Run kindde Packageou Directory.

Andrew W. Phillips
la source
1
Merci, c'est ce que je cherchais. Veuillez mentionner que votre réponse concerne Intellij IDEA.
kivagant le
13

Si vous utilisez go run, faites go run *.go. Il trouvera automatiquement tous les fichiers go dans le répertoire de travail actuel, compilera puis exécutera votre fonction principale.

Paul Razvan Berg
la source
Y a-t-il des inconvénients à le faire de cette façon? Cela semble être la réponse la plus simple à la question des PO.
Stavros_S
Une solution plus générale sous Bash: go run !(*_test).go- Golang: exécuter tous les fichiers .go du répertoire courant via la ligne de commande (package multi-fichiers)
Brent Bradburn
8

Vous pouvez essayer l'une des solutions suivantes.

Méthode 01 : supposons que le nom de votre projet estMyProject

  • allez à votre chemin, tapez go buildet appuyez sur Entrée.
  • il créera un fichier exécutable en tant que nom de votre projet ("MyProject")
  • puis dans votre type de terminal ./MyProjectet appuyez sur Entrée

vous pouvez effectuer les deux étapes à la fois en tapant go build && ./MyProject. il exécutera votre projet correctement avec tous les gofichiers.

Méthode 02

tapez simplement go run *.goet appuyez sur Entrée. cela exécutera tous vos fichiers go files.

J'espère que cela aidera quelqu'un.

Caldeira de Chanaka
la source
3

Si vous souhaitez appeler une fonction à partir d'un autre fichier go et que vous utilisez Goland, recherchez l'option 'Modifier la configuration' dans le menu Exécuter et changez le type d'exécution de Fichier à Répertoire. Il efface toutes les erreurs et vous permet d'appeler des fonctions à partir d'autres fichiers go.

Puneet Tokhi
la source
1

J'ai rencontré le même problème avec Go11, je voulais juste partager comment je l'ai résolu pour aider les autres au cas où ils rencontreraient le même problème.

J'avais mon projet Go à l' extérieur $GOPATH , donc j'ai dû activer GO111MODULE=onsans que cette option soit activée, cela vous posera ce problème; même si vous essayez de construire ou de tester le tout packageou directoryil ne sera pas résolu sansGO111MODULE=on

Muhammad Soliman
la source
1

vous devriez utiliser les modules go maintenant, si vous ne suivez pas Comment écrire du code go

Avec le module go, vous n'avez pas à mettre le code dans $ GOPATH / src. il peut aussi vivre dans n'importe quel autre endroit.

Vous pouvez déplacer le code vers un répertoire différent comme / employee, Pour le faire fonctionner Juste sous le répertoire des employés initialisez le module go

go mod init example.com/employee
Jeetsang
la source
0

go run .exécutera tous vos fichiers. Le point d'entrée est la fonction main()qui doit être unique au mainpackage.

Une autre option consiste à créer le binaire avec go buildet à l'exécuter.

Miguel Reyes
la source
0

Utilisez simplement la commande go run *.gopour exécuter tous les fichiers go de votre package!

d0zingcat
la source
La réponse est comme @Paul Razvan Berg réponse
Chris Catignani
-1

Si votre dossier source est structuré / go / src / blog (en supposant que le nom de votre dossier source est blog).

  1. cd / go / src / blog ... (cd dans le dossier contenant votre package)
  2. allez installer
  3. Blog

Cela devrait exécuter tous vos fichiers en même temps, au lieu d'avoir à lister les fichiers manuellement ou à "dénigrer" une méthode sur la ligne de commande.

Druhin Bala
la source
Le réalisez-vous go installet go buildêtes-vous différent? Et un exécutable est appelé en utilisant ./<executable>et non blog. Comme vous l'avez utilisé, go installil est dans votre GOPATH/bin(même ajouté à votre $ PATH, également) et c'est pourquoi blogfonctionne juste pour vous.
shmsr il y a