Como chamar a função de outro arquivo no idioma go?

107

Quero chamar a função de outro arquivo em go lang. Alguém pode ajudar?

test1.go

package main

func main() {
    demo()
}

test2.go

package main

import "fmt"

func main() {
}

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

Como chamar demoem test2partir test1?

Yves M.
fonte
O que você quer dizer com go fmt? Como no terminal ou o quê? Como isso mostra que ele se preocupa com alguma coisa?
Charlie Parker

Respostas:

77

Você não pode ter mais de um mainem seu pacote.

Mais geralmente, você não pode ter mais de uma função com um determinado nome em um pacote.

Remova o mainem test2.goe compile o aplicativo. A demofunção ficará visível a partir de test1.go.

Denys Séguret
fonte
1
Posso construir e executar após remover mainem test2.go, mas não conseguiu executar test1.go usando go run test1.goainda. Por quê ?
Jeff Li
87
go run test1.go test2.go
Rich Churcher
2
@RichChurcher, você deu a resposta. Obrigado . Além disso, você deve maiúsculas Demo () , funções públicas são maiúsculas por convenção
Raymond Chenon
Se test2 tiver uma estrutura, ela também será importada?
Angger
@RaymondChenon Letras maiúsculas só são necessárias quando uma função precisa ser usada em um pacote diferente. Nesse caso, como os dois arquivos estão no mesmo pacote 'principal', eles também podem acessar funções 'não exportadas' (leitura privada). Veja tour.golang.org/basics/3
Conheça Sinojia em
49

Go Lang por padrão constrói / executa apenas o arquivo mencionado. Para vincular todos os arquivos, você precisa especificar o nome de todos os arquivos durante a execução.

Execute um dos dois comandos abaixo:

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

Você deve fazer algo semelhante, se quiser construí-los.

rai.skumar
fonte
1
Direto ao ponto. Obrigado!
Russo
37

Eu estava procurando a mesma coisa. Para responder à sua pergunta " Como chamar demo em test2 de test1? ", Aqui está a maneira que fiz. Execute este código com o go run test1.gocomando. Altere current_folder para a pasta onde está test1.go.

test1.go

package main

import (
    L "./lib"
)

func main() {
    L.Demo()
}

lib \ test2.go

Coloque o arquivo test2.go na subpasta lib

package lib

import "fmt"

// This func must be Exported, Capitalized, and comment added.
func Demo() {
    fmt.Println("HI")
}
Bill Zelenko
fonte
5
Certifique-se de que o nome do método esteja maiúsculo, caso contrário não funcionará.
Máx.
1
Obrigado pela solução, me ajudou muito! :)
jenkizenki
Desculpe, mas isso claramente não está funcionando:package lib; expected main
Madeo
0

Se você apenas executar go run test1.goe esse arquivo tiver uma referência a uma função em outro arquivo dentro do mesmo pacote, ocorrerá um erro porque você não disse ao Go para executar o pacote inteiro, você disse a ele para executar apenas aquele arquivo.

Você pode dizer para executar como um pacote inteiro agrupando os arquivos como um pacote na execução commaned de várias maneiras. Aqui estão alguns exemplos (se o seu terminal estiver no diretório do seu pacote):

go run ./

OU

go run test1.go test2.go

OU

go run *.go

Você pode esperar o mesmo comportamento usando o comando build, e após executar o executável criado será executado como um pacote agrupado, onde os arquivos conhecem as funções uns dos outros, etc. Exemplo:

go build ./

OU

go build test1.go test2.go

OU

go build *.go

E então, simplesmente chamar o executável da linha de comando fornecerá uma saída semelhante ao uso do comando run quando você executou todos os arquivos juntos como um pacote inteiro. Ex:

./test1

Ou qualquer que seja o nome do arquivo executável chamado quando foi criado.

kiko carisse
fonte