Comment appeler une fonction à partir d'un autre fichier en langue go?

109

Je veux appeler une fonction à partir d'un autre fichier dans go lang, quelqu'un peut-il m'aider?

test1.go

package main

func main() {
    demo()
}

test2.go

package main

import "fmt"

func main() {
}

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

Comment appeler demoà test2partir test1?

Yves M.
la source
Que voulez-vous dire go fmt? Comme dans le terminal ou quoi? Comment cela montre-t-il qu'il se soucie de quoi que ce soit?
Charlie Parker

Réponses:

78

Vous ne pouvez pas en avoir plus d'un maindans votre colis.

Plus généralement, vous ne pouvez pas avoir plus d'une fonction avec un nom donné dans un package.

Supprimez le mainin test2.goet compilez l'application. La demofonction sera visible depuis test1.go.

Denys Séguret
la source
1
Je peux construire et exécuter après avoir supprimé maindans test2.go mais je n'ai pas réussi à exécuter test1.go en utilisant go run test1.gostill. Pourquoi ?
Jeff Li
87
go run test1.go test2.go
Rich Churcher
2
@RichChurcher, vous avez donné la réponse. Merci . Aussi, vous devriez démo en majuscules () , les fonctions publiques sont en majuscules par convention
Raymond Chenon
Si test2 a une structure, sera-t-elle également importée?
Angger
@RaymondChenon Les majuscules ne sont requises que lorsqu'une fonction doit être utilisée dans un package différent. Dans ce cas, puisque les deux fichiers sont dans le même paquet «main», ils peuvent également accéder aux fonctions «non exportées» (lecture privée). Voir tour.golang.org/basics/3
Rencontrez Sinojia
50

Go Lang par défaut construit / exécute uniquement le fichier mentionné. Pour lier tous les fichiers, vous devez spécifier le nom de tous les fichiers lors de l'exécution.

Exécutez l'une des deux commandes ci-dessous:

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

Vous devriez faire la même chose si vous voulez les construire.

rai.skumar
la source
38

Je cherchais la même chose. Pour répondre à votre question " Comment appeler la démo dans test2 depuis test1? ", Voici comment je l'ai fait. Exécutez ce code avec la go run test1.gocommande. Modifiez le CURRENT_FOLDER au dossier où test1.go est.

test1.go

package main

import (
    L "./lib"
)

func main() {
    L.Demo()
}

lib \ test2.go

Placez le fichier test2.go dans le sous-dossier lib

package lib

import "fmt"

// This func must be Exported, Capitalized, and comment added.
func Demo() {
    fmt.Println("HI")
}
Bill Zelenko
la source
5
Assurez-vous que le nom de la méthode est en majuscule, sinon cela ne fonctionnera pas.
Max
1
Merci pour votre solution, cela m'a beaucoup aidé! :)
jenkizenki
Désolé mais cela ne fonctionne clairement pas:package lib; expected main
Madeo
0

Si vous venez d'exécuter go run test1.goet que ce fichier a une référence à une fonction dans un autre fichier dans le même package, une erreur se produira car vous n'avez pas dit à Go d'exécuter l'ensemble du package, vous lui avez dit de n'exécuter que ce fichier.

Vous pouvez dire à go de s'exécuter en tant que package complet en regroupant les fichiers en tant que package dans l'exécution de plusieurs manières. Voici quelques exemples (si votre terminal est dans le répertoire de votre package):

go run ./

OU

go run test1.go test2.go

OU

go run *.go

Vous pouvez vous attendre au même comportement en utilisant la commande build, et après avoir exécuté l'exécutable créé, il s'exécutera comme un package groupé, où les fichiers connaissent les autres fonctions, etc. Exemple:

go build ./

OU

go build test1.go test2.go

OU

go build *.go

Et ensuite, simplement appeler l'exécutable à partir de la ligne de commande vous donnera une sortie similaire à l'utilisation de la commande run lorsque vous avez exécuté tous les fichiers ensemble comme un package complet. Ex:

./test1

Ou quel que soit le nom de votre fichier exécutable qui est appelé lors de sa création.

kiko carisse
la source