web-dev-qa-db-fra.com

golang "undefined" fonction déclarée dans un autre fichier?

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

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

Merci d'avance

85
Juan M

Veuillez lire "Comment écrire un code Go"

N'utilisez pas /src dans votre GOPATH. Les paquets sont situés dans $GOPATH/src.

Pour build ou install, vous devez avoir vos fichiers dans un répertoire de paquet. 

Pour go run, vous devez fournir tous les fichiers en tant qu'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 go build crée de la confusion lorsque vous travaillez avec des packages non principaux)

110
JimB

Je viens d'avoir le même problème dans GoLand et j'ai trouvé une solution. Vous devez changer le Run kind de File à Package ou Directory. Vous pouvez choisir ceci dans une liste déroulante si vous allez dans Run/Edit Configurations.

Pour le package ~/go/src/a_package, le Package path est le a_package et le Directory est le ~/go/src/a_package. Vous pouvez choisir le Run kind que vous aimez.

32
Andrew W. Phillips

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.

4
Paul Berg

Si vous souhaitez appeler une fonction à partir d'un autre fichier go et que vous utilisez Goland, recherchez l'option 'Edit configuration' dans le menu Run et modifiez le type d'exécution de File to Directory. Il efface toutes les erreurs et vous permet d’appeler des fonctions à partir d’autres fichiers go.

3
Puneet Tokhi

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

J'avais mon projet Go extérieur $GOPATH, je devais donc activer GO111MODULE=on sans que cette option ne soit activée, cela vous donnera ce problème; même si vous essayez de construire ou de tester l'ensemble package ou directory, il ne sera pas résolu sans GO111MODULE=on

0
msoliman

Vous pouvez essayer l'une des suivantes.

Method 01: supposons que le nom de votre projet est MyProject

  • allez à votre chemin, tapez go build et appuyez sur Entrée.
  • il créera un fichier exécutable comme nom de projet ("MyProject")
  • puis dans votre terminal tapez ./MyProject et appuyez sur Entrée

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

Méthode 02

il suffit de taper go run *.go et d'appuyer sur Entrée. ceci exécutera tous vos go files.

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

0
Anuradh S

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 paquet)
  2. aller installer
  3. blog

Cela devrait exécuter tous vos fichiers en même temps, au lieu que vous ayez à les lister manuellement ou à "faucher" une méthode sur la ligne de commande.

0
Druhin Bala