importar archivos go en la misma carpeta

84

Tengo dificultades para importar un archivo go local a otro archivo go.

La estructura de mi proyecto es como algo a continuación

-samplego
--pkg
--src
---github.com
----xxxx
-----a.go
-----b.go
--bin

Estoy intentando importar a.go dentro de b.go. Intenté lo siguiente,

import "a"
import "github.com/xxxx/a"

Ninguno de estos funcionó ... Entiendo que tengo que entrometerme con GOPATH pero no pude hacerlo bien. Actualmente, mi GOPATH apunta a samplego (/ workspace / samplego). Recibo el siguiente error

cannot find package "a" in any of:
/usr/local/go/src/pkg/a (from $GOROOT)
/workspace/samplego/src/a (from $GOPATH)

Además, ¿cómo funciona GOPATH cuando estos archivos fuente se importan a otro proyecto / módulo? ¿Serían entonces un problema las importaciones locales? ¿Cuál es la mejor práctica en este caso? ¿Es tener solo un archivo go en el módulo (con las pruebas asociadas)?

g0c00l.g33k
fuente
Cualquier cantidad de archivos en un directorio son parte del mismo paquete desde el principio. (Y deben tener la misma package adeclaración en la parte superior.)
twotwotwo
Gracias @twotwotwo ... ¿Podrías dejarme saber cómo resolver el problema anterior? Además, cuando tenemos varios archivos go en un paquete, la importación debe seguir la ruta completa, por ejemplo. github.com/xxxx/a o simplemente a haría
g0c00l.g33k
Para los módulos de Go, los archivos en el mismo directorio siguen siendo parte del mismo paquete, todavía necesitan tener el mismo nombre de paquete (p. Ej., package foo) Y todavía no necesitan importarse directamente entre sí. Esta respuesta cubre esto un poco más para los módulos Go, incluido cómo importar paquetes en el mismo módulo en los módulos Go.
típico182

Respuestas:

76

Cualquier número de archivos en un directorio es un solo paquete; los símbolos declarados en un archivo están disponibles para los demás sin ningún imports ni calificadores. Todos los archivos necesitan la misma package foodeclaración en la parte superior (o obtendrá un error go build).

Usted tiene que GOPATHestablecerse en el directorio donde sus pkg, srcy bindirectorios residen. Esto es solo una cuestión de preferencia, pero es común tener un solo espacio de trabajo para todas sus aplicaciones (a veces $HOME), no una por aplicación.

Normalmente, una ruta de Github sería github.com/username/reponame(no solo github.com/xxxx). Entonces, si desea tener mainy otro paquete, puede terminar haciendo algo workspace/srccomo

github.com/
  username/
    reponame/
      main.go   // package main, importing "github.com/username/reponame/b"
      b/
        b.go    // package b

Tenga en cuenta que siempre importa con la github.com/...ruta completa : no se permiten importaciones relativas en un espacio de trabajo. Si se cansa de escribir rutas, use goimports. Si se las arreglaba go run, es hora de cambiar a go build: runtrata mal con varios archivos mainy no me molesté en probar, pero escuché (de Dave Cheney aquí ) go runque no reconstruye las dependencias sucias.

Parece que al menos ha intentado configurar GOPATH en lo correcto, por lo que si aún está atascado, tal vez incluya exactamente cómo configuró la variable de entorno (el comando, etc.) y qué comando ejecutó y qué error sucedió. Aquí hay instrucciones sobre cómo configurarlo (y hacer que la configuración sea persistente) en Linux / UNIX y aquí están los consejos del equipo de Go sobre la configuración del espacio de trabajo . Quizás ninguno de los dos ayude, pero eche un vistazo y al menos señale qué parte lo confunde si está confundido.

dos
fuente
1
goimports fue muy útil :)
g0c00l.g33k
Si tiene problemas para ejecutar varios archivos en el paquete principal, consulte esta respuesta .
Rick Smith
Agregué la misma package maindeclaración a todos los archivos en el mismo directorio, pero tengo el undefinederror, main.gono puedo ver las funciones del archivo controllers.goque está en el mismo directorio.
lunes
2
@AlexChaliy Si está usando go run, es posible que deba pasarle explícitamente ambos nombres de archivo, o cambiar a ponerlos en un paquete en su GOPATH y luego agregarlo go build. También verifique dos veces los errores comunes no relacionados con la estructura del paquete (como un nombre escrito). Si nada de eso lo resuelve, abriría una nueva pregunta con todos los detalles que pueda; Puede que sea necesario discutir mucho sobre cómo se resuelven su directorio, archivos, etc., y dado que se trataría específicamente de su configuración, una nueva pregunta parece ser el mejor lugar para eso.
twotwotwo
40

No es necesaria ninguna importación siempre que declare ambos a.goy b.goque estén en el mismo paquete. Luego, puede utilizar go runpara reconocer varios archivos con:

$ go run a.go b.go
Jason Kao
fuente
14

./main.go (en el paquete principal)
./a/a.go (en el paquete a)
./a/b.go (en el paquete a)

en este caso:
main.go import "./a"

Puede llamar a la función en a.go y b.go, que tiene las primeras letras en mayúsculas.

usuario2889485
fuente
0

Solo quería algo realmente básico para sacar algunos archivos de la carpeta principal, como la respuesta del usuario2889485, pero su respuesta específica no funcionó para mí. No me importaba si estaban en el mismo paquete o no.

Mi espacio de trabajo GOPATH es c:\work\goy debajo tengo

/src/pg/main.go      (package main)
/src/pg/dbtypes.go   (pakage dbtypes)

en main.goyo import "/pg/dbtypes"

Dave Pile
fuente