Wie rufe ich eine Funktion aus einer anderen Datei in der Sprache go auf?

106

Ich möchte die Funktion aus einer anderen Datei in go lang aufrufen. Kann jemand helfen?

test1.go

package main

func main() {
    demo()
}

test2.go

package main

import "fmt"

func main() {
}

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

Wie Aufruf demoin test2aus test1?

Yves M.
quelle
Was meinst du damit go fmt? Wie im Terminal oder was? Wie zeigt es, dass er sich um irgendetwas kümmert?
Charlie Parker

Antworten:

76

Sie können nicht mehr als eine mainin Ihrem Paket haben.

Im Allgemeinen können Sie nicht mehr als eine Funktion mit einem bestimmten Namen in einem Paket haben.

Entfernen Sie das mainIn test2.gound kompilieren Sie die Anwendung. Die demoFunktion ist sichtbar von test1.go.

Denys Séguret
quelle
1
Ich kann nach dem Entfernen mainin test2.go erstellen und ausführen, konnte test1.go jedoch nicht mit go run test1.gostill ausführen . Warum ?
Jeff Li
87
go run test1.go test2.go
Rich Churcher
2
@RichChurcher, du hast die Antwort gegeben. Vielen Dank . Auch sollten Sie Demo () in Großbuchstaben schreiben, öffentliche Funktionen werden gemäß Konvention in Großbuchstaben geschrieben
Raymond Chenon
Wenn test2 eine Struktur hat, wird sie auch importiert?
Angger
@RaymondChenon Großbuchstaben sind nur erforderlich, wenn eine Funktion in einem anderen Paket verwendet werden muss. In diesem Fall können beide Dateien, da sie sich im selben Paket 'main' befinden, auch auf nicht exportierte (privat gelesene) Funktionen zugreifen. Siehe tour.golang.org/basics/3
Treffen Sie Sinojia
48

Go Lang erstellt / führt standardmäßig nur die angegebene Datei aus. Um alle Dateien zu verknüpfen, müssen Sie während der Ausführung den Namen aller Dateien angeben.

Führen Sie einen der beiden folgenden Befehle aus:

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

Sie sollten etwas Ähnliches tun, wenn Sie sie erstellen möchten.

rai.skumar
quelle
37

Ich habe das Gleiche gesucht. Um Ihre Frage " Wie rufe ich Demo in Test2 von Test1 auf? " Zu beantworten, habe ich Folgendes getan. Führen Sie diesen Code mit dem go run test1.goBefehl aus. Ändern Sie den current_folder auf den Ordner , wo test1.go ist.

test1.go

package main

import (
    L "./lib"
)

func main() {
    L.Demo()
}

lib \ test2.go

Legen Sie die Datei test2.go im Unterordner ab lib

package lib

import "fmt"

// This func must be Exported, Capitalized, and comment added.
func Demo() {
    fmt.Println("HI")
}
Bill Zelenko
quelle
5
Stellen Sie sicher, dass der Methodenname groß geschrieben ist, da er sonst nicht funktioniert.
Max
1
Vielen Dank für Ihre Lösung, es hat mir sehr geholfen! :)
Nick Hall
Entschuldigung, aber das funktioniert eindeutig nicht:package lib; expected main
Madeo
0

Wenn Sie nur ausführen go run test1.gound diese Datei einen Verweis auf eine Funktion in einer anderen Datei innerhalb desselben Pakets enthält, tritt ein Fehler auf, da Sie Go nicht angewiesen haben, das gesamte Paket auszuführen, sondern nur diese eine Datei auszuführen.

Sie können go to run als ganzes Paket festlegen, indem Sie die Dateien als Paket in dem auf verschiedene Arten kommandierten Lauf gruppieren. Hier einige Beispiele (wenn sich Ihr Terminal im Verzeichnis Ihres Pakets befindet):

go run ./

ODER

go run test1.go test2.go

ODER

go run *.go

Mit dem Befehl build können Sie dasselbe Verhalten erwarten. Nach dem Ausführen wird die erstellte ausführbare Datei als gruppiertes Paket ausgeführt, in dem die Dateien über die Funktionen des jeweils anderen Bescheid wissen. Beispiel:

go build ./

ODER

go build test1.go test2.go

ODER

go build *.go

Wenn Sie anschließend einfach die ausführbare Datei über die Befehlszeile aufrufen, erhalten Sie eine ähnliche Ausgabe wie mit dem Befehl run, wenn Sie alle Dateien zusammen als Ganzes ausgeführt haben. Ex:

./test1

Oder wie auch immer Ihr ausführbarer Dateiname beim Erstellen aufgerufen wird.

kiko carisse
quelle