¿Función "indefinida" de golang declarada en otro archivo?

135

Estoy tratando de escribir un programa básico que llame a una función en un archivo diferente, pero que sea parte del mismo paquete. Sin embargo, devuelve:

undefined: NewEmployee

Aquí está el código fuente:

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
fuente
¿Sus archivos tienen declaraciones de paquete? Lo que escribió no tiene un package x, también su paquete principal generalmente solo contiene un solo archivo, luego importa las otras piezas que necesita
Chris Pfohl
8
estás usando go run? (y ver golang.org/doc/code.html )
JimB
1
@JuanM, mi pregunta es si esa es la fuente completa de main.goy employee.go. Porque se supone que todos los archivos go tienen una declaración de paquete, y no veo ninguno en el suyo. Ver: golang.org/doc/code.html#PackageNames
Chris Pfohl
1
La última función de employee.go es incorrecta (sin nombre de función, sin tipo de retorno declarado). No es el problema que pides, pero muestra que hay más problemas. ¿Podría publicar el código completo y el error completo al compilar?
siritinga
1
¡entonces muéstranos lo que estás haciendo! GOPATH, código real y cómo estás invocando la goherramienta.
JimB

Respuestas:

172

Lea "Cómo escribir el código Go" .

No lo uses /srcen tu GOPATH. Los paquetes se encuentran en $GOPATH/src.

Para buildo installnecesita tener sus archivos en un directorio de paquetes.

Para go run, debe proporcionar todos los archivos como argumento:

go run main.go employee.go

Pero, casi siempre debe usar go install, o go build(y preferiblemente el primero, ya que go buildcausa confusión al trabajar con paquetes no principales)

JimB
fuente
gracias por el aporte @JimB! Edité las variables de entorno (también me había olvidado de configurar GOBIN), moví mis archivos a la ubicación correcta, pero aún así cuando intento ir intstall obtengo el mismo error. ¿Alguna sugerencia?
Juan M
¿Estás seguro de que no hay otros errores? Su archivo employee.go no puede compilarse tal cual. De lo contrario, necesito ver exactamente lo que estás haciendo.
Rutas
8
O haz $ go run * .go
Puran
hacer la ejecución $ go run *.gosería un acceso directo en lugar de ejecutar todos los archivos
offerni
60

Acabo de tener el mismo problema en GoLand (que es Intellij IDEA for Go) y encontré una solución. Necesita cambiar el Run kindde Filea Packageo Directory. Puede elegir esto en un menú desplegable si accede a Run/EditConfiguraciones.

Por ejemplo: para el paquete ~/go/src/a_package, use un Package pathde a_packagey un Directoryde ~/go/src/a_packagey Run kindde Packageo Directory.

Andrew W. Phillips
fuente
1
Gracias, esto es lo que estaba buscando. Mencione que su respuesta es sobre Intellij IDEA.
kivagant
12

Si estás usando go run, hazlo go run *.go. Encontrará automáticamente todos los archivos go en el directorio de trabajo actual, compilará y luego ejecutará su función principal.

Paul Razvan Berg
fuente
¿Hay alguna desventaja en hacerlo de esta manera? Esta parece ser la respuesta más simple a la pregunta de los OP.
Stavros_S
8

Puedes probar uno de los siguientes.

Método 01 : suponga que el nombre de su proyecto esMyProject

  • vaya a su camino, escriba go buildy presione enter.
  • creará un archivo ejecutable como el nombre de su proyecto ("MyProject")
  • luego en su terminal escriba ./MyProjecty presione enter

Puede hacer ambos pasos a la vez escribiendo go build && ./MyProject. ejecutará su proyecto correctamente con todos los goarchivos.

Método 02

solo escribe go run *.goy presiona enter. esto ejecutará todo tu go files.

Espero que esto ayude a alguien.

Caldera Chanaka
fuente
4

Si desea llamar a una función desde otro archivo go y está utilizando Goland, busque la opción 'Editar configuración' en el menú Ejecutar y cambie el tipo de ejecución de Archivo a Directorio. Borra todos los errores y le permite llamar a funciones desde otros archivos go.

Puneet Tokhi
fuente
1

Me encontré con el mismo problema con Go11, solo quería compartir cómo lo resolví para ayudar a otros en caso de que se encontraran con el mismo problema.

Tenía mi proyecto Go afuera $GOPATH , así que tuve que activarlo GO111MODULE=onsin esta opción activada, esto le dará este problema; incluso si intentas construir o probar todo packageo directoryno se resolverá sinGO111MODULE=on

Muhammad Soliman
fuente
1

debe usar los módulos go ahora, si no está siguiendo Cómo escribir el código go

Con el módulo go no tiene que poner el código en $ GOPATH / src. También puede vivir en cualquier otro lugar.

Puede mover el código a un directorio diferente como / employee, para que funcione. En el directorio de empleados, inicialice el módulo go

go mod init example.com/employee
Jeetsang
fuente
0

Si su carpeta de origen está estructurada / go / src / blog (suponiendo que el nombre de su carpeta de origen es blog).

  1. cd / go / src / blog ... (cd dentro de la carpeta que tiene su paquete)
  2. ve a instalar
  3. Blog

Eso debería ejecutar todos sus archivos al mismo tiempo, en lugar de tener que enumerar los archivos manualmente o "bashing" un método en la línea de comandos.

Druhin Bala
fuente
0

go run .ejecutará todos sus archivos. El punto de entrada es la función main()que debe ser exclusiva del mainpaquete.

Otra opción es construir el binario con go buildy ejecutarlo.

Miguel Reyes
fuente
0

¡Solo use el comando go run *.gopara ejecutar todos los archivos go en su paquete!

d0zingcat
fuente
La respuesta es como @Paul Razvan Berg
Chris Catignani