Come chiamare la funzione da un altro file in go language?


109

Voglio chiamare la funzione da un altro file in go lang, qualcuno può aiutare?

test1.go

package main

func main() {
    demo()
}

test2.go

package main

import "fmt"

func main() {
}

func demo() {
    fmt.Println("HI")
}

Come chiamare demoin test2da test1?


Cosa intendi per go fmt? Come nel terminale o cosa? Come mostra che gli importa di qualcosa?
Charlie Parker

Risposte:


78

Non puoi averne più di uno mainnel pacco.

Più in generale, non puoi avere più di una funzione con un dato nome in un pacchetto.

Rimuovere l' mainin test2.goe compilare l'applicazione. La demofunzione sarà visibile da test1.go.


1
Posso creare ed eseguire dopo la rimozione mainin test2.go ma non riesco a eseguire test1.go usando go run test1.goancora. Perché ?
Jeff Li

88
go run test1.go test2.go
Rich Churcher

2
@RichChurcher, hai dato la risposta. Grazie . Inoltre dovresti usare le maiuscole Demo () , le funzioni pubbliche sono in maiuscolo per convenzione
Raymond Chenon

Se test2 ha una struttura, verrà importata anche questa?
Angger

@RaymondChenon Il maiuscolo è richiesto solo quando una funzione deve essere utilizzata in un pacchetto diverso. In questo caso, poiché entrambi i file si trovano nello stesso pacchetto "main", possono accedere anche alle funzioni "non esportate" (lettura privata). Vedi tour.golang.org/basics/3
Meet Sinojia il

51

Go Lang per impostazione predefinita crea / esegue solo il file menzionato. Per collegare tutti i file è necessario specificare il nome di tutti i file durante l'esecuzione.

Esegui uno dei due comandi seguenti:

$go run test1.go test2.go. //order of file doesn't matter
$go run *.go

Dovresti fare una cosa simile, se vuoi costruirli.


38

Stavo cercando la stessa cosa. Per rispondere alla tua domanda " Come chiamare demo in test2 da test1? ", Ecco come l'ho fatto. Esegui questo codice con il go run test1.gocomando. Modificare il current_folder alla cartella in cui è test1.go.

test1.go

package main

import (
    L "./lib"
)

func main() {
    L.Demo()
}

lib \ test2.go

Metti il ​​file test2.go nella sottocartella lib

package lib

import "fmt"

// This func must be Exported, Capitalized, and comment added.
func Demo() {
    fmt.Println("HI")
}

5
Assicurati che il nome del metodo sia in maiuscolo, altrimenti non funzionerà.
Max

1
Grazie per la tua soluzione, mi ha aiutato molto! :)
jenkizenki

Scusa ma chiaramente non funziona:package lib; expected main
Madeo

0

Se esegui go run test1.goe quel file ha un riferimento a una funzione in un altro file all'interno dello stesso pacchetto, si verificherà un errore perché non hai detto a Go di eseguire l'intero pacchetto, gli hai detto di eseguire solo quel file.

Puoi dire di andare a eseguire come un intero pacchetto raggruppando i file come un pacchetto nella corsa comandata in diversi modi. Ecco alcuni esempi (se il tuo terminale è nella directory del tuo pacchetto):

go run ./

O

go run test1.go test2.go

O

go run *.go

Puoi aspettarti lo stesso comportamento usando il comando build, e dopo aver eseguito l'eseguibile creato verrà eseguito come un pacchetto raggruppato, dove i file conoscono le funzioni degli altri, ecc. Esempio:

go build ./

O

go build test1.go test2.go

O

go build *.go

E poi, semplicemente chiamando l'eseguibile dalla riga di comando, otterrai un output simile all'utilizzo del comando run quando hai eseguito tutti i file insieme come un intero pacchetto. Ex:

./test1

O qualunque sia il nome del tuo file eseguibile chiamato quando è stato creato.

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.