Golang "non definita" funzione dichiarata in un altro file?


135

Sto provando a scrivere un programma go di base che chiama una funzione su un file diverso, ma parte dello stesso pacchetto. Tuttavia, restituisce:

undefined: NewEmployee

Ecco il codice sorgente:

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

i tuoi file hanno dichiarazioni di pacchetti? Quello che hai digitato non ha un package x, anche il tuo pacchetto principale in genere contiene solo un singolo file, quindi importa gli altri pezzi di cui ha bisogno
Chris Pfohl,

8
stai usando go run? (e vedi golang.org/doc/code.html )
JimB,

1
@JuanM, la mia domanda era: la fonte completa di main.goe employee.go? Perché tutti i file go dovrebbero avere un'istruzione di pacchetto e non ne vedo nessuno nel tuo. Vedi: golang.org/doc/code.html#PackageNames
Chris Pfohl,

1
L'ultima funzione di employee.go è errata (nessun nome di funzione, nessun tipo di ritorno dichiarato). Non è il problema che chiedi, ma mostra che ci sono più problemi. Potresti pubblicare il codice completo e l'errore completo durante la compilazione?
Siritinga,

1
quindi mostraci cosa stai facendo! GOPATH, codice attuale e come stai invocando lo gostrumento.
JimB,

Risposte:


173

Si prega di leggere "Come scrivere il codice Go" .

Non usare /srcnel tuo GOPATH. I pacchetti si trovano in $GOPATH/src.

Per buildo installè necessario disporre dei file in una directory del pacchetto.

Per go run, è necessario fornire tutti i file come argomento:

go run main.go employee.go

Ma, dovresti quasi sempre usare go install, o go build(e preferibilmente il primo, poiché go buildcrea confusione quando lavori con pacchetti non principali)


grazie per l'input @JimB! Ho modificato le variabili di ambiente (avevo anche dimenticato di impostare GOBIN), ho spostato i miei file nella posizione corretta, ma ancora quando provo ad entrare nella schermata ottengo lo stesso errore. Eventuali suggerimenti?
Juan M,

Sei sicuro che non ci siano altri errori? Il file employee.go non può essere compilato così com'è. Altrimenti, devo vedere esattamente cosa stai facendo. Percorsi esatti, invocazione, ecc.
JimB,

8
O esegui $ go run * .go
Puran l'

fare run $ go run *.gosarebbe una scorciatoia invece di eseguire tutti i file
offerni

61

Ho appena avuto lo stesso problema in GoLand (che è Intellij IDEA per Go) e ho trovato una soluzione. Devi cambiare Run kindda da Filea Packageo Directory. Puoi sceglierlo da un menu a discesa se vai in Run/EditConfigurazioni.

Ad esempio: per il pacchetto ~/go/src/a_package, utilizzare un Package pathdi a_packagee un Directorydi ~/go/src/a_packagee Run kinddi Packageo Directory.


1
Grazie, questo è quello che stavo cercando. Ricorda che la tua risposta riguarda Intellij IDEA.
kivagant,

13

Se stai usando go run, fallo go run *.go. Troverà automaticamente tutti i file go nella directory di lavoro corrente, compilerà e quindi eseguirà la funzione principale.


Ci sono degli svantaggi nel farlo in questo modo? Questa sembra la risposta più semplice alla domanda dei PO.
Stavros_S,


8

Puoi provare uno dei seguenti.

Metodo 01 : supponi che sia il nome del tuo progettoMyProject

  • vai al tuo percorso, digita go builde premi invio.
  • creerà un file eseguibile come nome del progetto ("MyProject")
  • quindi digita il tuo terminale ./MyProjecte premi invio

puoi eseguire entrambi i passaggi contemporaneamente digitando go build && ./MyProject. eseguirà il progetto correttamente con tutti i gofile.

Metodo 02

basta digitare go run *.goe premere invio. questo eseguirà tutto il tuo go files.

Spero che questo possa aiutare qualcuno.


4

Se vuoi chiamare una funzione da un altro file go e stai usando Goland, trova l'opzione 'Modifica configurazione' dal menu Esegui e cambia il tipo di esecuzione da File a Directory. Elimina tutti gli errori e consente di chiamare funzioni da altri file go.


1

Ho riscontrato lo stesso problema con Go11, volevo solo condividere il modo in cui l'ho risolto per aiutare gli altri nel caso in cui si imbattano nello stesso problema.

Ho avuto il mio progetto Go all'esterno $GOPATH , quindi ho dovuto accendere GO111MODULE=onsenza questa opzione attivata, questo ti darà questo problema; anche se provi a costruire o testare il tutto packageo directorynon sarà risolto senzaGO111MODULE=on


1

dovresti usare i moduli go ora, se non stai seguendo Come scrivere il codice go

Con il modulo go non è necessario inserire il codice in $ GOPATH / src. può vivere anche in qualsiasi altra posizione.

Puoi spostare il codice in directory diverse come / employee, per farlo funzionare Appena sotto la directory dei dipendenti inizializza il modulo go

go mod init example.com/employee

0

Se la cartella di origine è strutturata / go / src / blog (supponendo che il nome della cartella di origine sia blog).

  1. cd / go / src / blog ... (cd all'interno della cartella che contiene il pacchetto)
  2. vai a installare
  3. blog

Ciò dovrebbe eseguire tutti i tuoi file contemporaneamente, invece di dover elencare i file manualmente o "bashing" un metodo dalla riga di comando.


0

go run .eseguirà tutti i tuoi file. Il punto di ingresso è la funzione main()che deve essere unica per il mainpacchetto.

Un'altra opzione è quella di creare go builded eseguire il binario .


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.