função "indefinida" golang declarada em outro arquivo?

135

Estou tentando escrever um programa básico que chama uma função em um arquivo diferente, mas faz parte do mesmo pacote. No entanto, ele retorna:

undefined: NewEmployee

Aqui está o código fonte:

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!"
}
Juan M
fonte
seus arquivos possuem instruções de pacote? O que você digitou não possui um package x, também o seu pacote principal normalmente contém apenas um único arquivo e importa as outras peças necessárias
317 Chris Pfohl
8
você está usando go run? (e consulte golang.org/doc/code.html )
JimB 26/01
1
@ JuanM, minha pergunta era: essa é a fonte completamain.go e employee.go? Porque todos os arquivos go devem ter uma declaração de pacote e não vejo nenhum na sua. Veja: golang.org/doc/code.html#PackageNames
Chris Pfohl
1
A última função de employee.go está incorreta (nenhum nome de função, nenhum tipo de retorno declarado). Não é o problema que você pede, mas mostra que há mais problemas. Você poderia postar o código completo e o erro completo ao compilar?
precisa saber é
1
então nos mostre o que você está fazendo! GOPATH, código real e como você está chamando a goferramenta.
JimB

Respostas:

172

Por favor, leia "Como escrever o código Go" .

Não use /srcno seu GOPATH. Pacotes estão localizados em $GOPATH/src.

Para buildou installvocê precisa ter seus arquivos em um diretório de pacotes.

Para go run, você precisa fornecer todos os arquivos como argumento:

go run main.go employee.go

Mas você quase sempre deve usar go install, ou go build(e de preferência o primeiro, como go buildcausa confusão ao trabalhar com pacotes não principais)

JimB
fonte
obrigado pela entrada @JimB! Editei as variáveis ​​de ambiente (também esqueci de definir o GOBIN), movi meus arquivos para o local correto, mas ainda assim, quando tento entrar no intstall, recebo o mesmo erro. Alguma sugestão?
Juan M
Tem certeza de que não há outros erros? Seu arquivo employee.go não pode ser compilado como está. Caso contrário, preciso ver exatamente o que você está fazendo. Caminhos exatos, invocação etc.
JimB
8
Ou faça $ go run * .go
Puran
fazer executar $ go run *.goseria um atalho em vez de executar todos os arquivos
offerni
60

Acabei de ter o mesmo problema no GoLand (que é o Intellij IDEA for Go) e resolvi uma solução. Você precisa alterar o Run kindde Filepara Packageou Directory. Você pode escolher isso em um menu suspenso se entrar emRun/Edit Configurações.

Por exemplo: no pacote ~/go/src/a_package, use a Package pathde a_packagee a Directoryde ~/go/src/a_packagee Run kindde Packageou Directory.

Andrew W. Phillips
fonte
1
Obrigado, é isso que eu estava procurando. Mencione que sua resposta é sobre a Intellij IDEA.
precisa saber é o seguinte
12

Se você estiver usando go run, faça go run *.go. Ele encontrará automaticamente todos os arquivos go no diretório de trabalho atual, compilará e executará sua função principal.

Paul Razvan Berg
fonte
Existem falhas em fazê-lo dessa maneira? Essa parece ser a resposta mais simples para a pergunta dos POs.
Stavros_S 4/18
8

Você pode tentar um dos seguintes.

Método 01 : suponha que o nome do seu projeto sejaMyProject

  • vá para o seu caminho, digite go builde pressione enter.
  • ele cria um arquivo executável como o nome do seu projeto ("MyProject")
  • depois no seu tipo de terminal ./MyProjecte pressione enter

você pode executar as duas etapas ao mesmo tempo digitando go build && ./MyProject. ele executará seu projeto corretamente com todosgo arquivos.

Método 02

basta digitar go run *.goe pressionar enter. isso executará todo o seu go files.

Espero que isso ajude alguém.

Chanaka Caldera
fonte
4

Se você quiser chamar uma função de outro arquivo go e estiver usando o Goland, encontre a opção 'Editar configuração' no menu Executar e altere o tipo de execução de Arquivo para Diretório. Ele limpa todos os erros e permite chamar funções de outros arquivos go.

Puneet Tokhi
fonte
1

Corri para o mesmo problema com Go11 , só queria compartilhar como o resolvi para ajudar outras pessoas, caso elas encontrem o mesmo problema.

Eu tinha o meu projeto Go fora $GOPATH , então tive que ativar GO111MODULE=onsem essa opção ativada, ele vai te dar esse problema; mesmo se você tentar construir ou testar o todo packageou directoryele não será resolvido semGO111MODULE=on

Muhammad Soliman
fonte
1

você deve usar os módulos go agora, se não estiver seguindo Como escrever código go

Com o módulo go, você não precisa colocar o código no $ GOPATH / src. também pode morar em qualquer outro local.

Você pode mover o código para um diretório diferente, como / employee, Para fazê-lo funcionar. Apenas no diretório employee, inicialize o módulo go

go mod init example.com/employee
Jeetsang
fonte
0

Se sua pasta de origem estiver estruturada / go / src / blog (assumindo que o nome da pasta de origem seja blog).

  1. cd / go / src / blog ... (CD dentro da pasta que contém o seu pacote)
  2. vá instalar
  3. blogue

Isso deve executar todos os seus arquivos ao mesmo tempo, em vez de você precisar listar os arquivos manualmente ou "bashing" um método na linha de comando.

Druhin Bala
fonte
0

go run .irá executar todos os seus arquivos. O ponto de entrada é a função main()que deve ser exclusiva para o mainpacote.

Outra opção é construir o binário go builde executá-lo.

Miguel Reyes
fonte
0

Basta usar o comando go run *.gopara executar todos os arquivos go no seu pacote!

d0zingcat
fonte
A resposta é como @Paul Razvan Berg resposta
Chris Catignani