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!"
}

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)


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.


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.


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


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.


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.


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


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

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.


0

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


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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.