¿Algún buen consejo sobre cómo evitar el ciclo de importación en Go?

Estoy trabajando en un proyecto Go por un mes. Lo bueno es que Go es realmente muy eficiente. Pero después de un mes de desarrollo ya tengo miles de líneas de código y muchaspackages. Para evitar el ciclo de importación es un problema importante para mí que cada vez que tengo un error en el ciclo de importación, no tengo idea de dónde puede estar el problema a la primera.

El compilador Go también tiene un aviso muy simple que no siempre es lo suficientemente bueno como para localizar un problema rápidamente como:main.go:7:3: import cycle not allowed. Solo le ayudará a saber qué archivo puede causar el problema pero nada más profundo. Ya queimport la relación se vuelve cada vez más compleja a medida que el código crece, estoy ansioso por saber cómo evitar el ciclo de importación de manera más eficiente en Go. Cualquier ayuda es muy apreciada.

Respuestas a la pregunta(3)

Solución de preguntas
go list -f '{{join .Deps "\n"}}' <import-path>

Mostrará las dependencias de importación para el paquete en<import-path> - o en el directorio actual si<import-path> se deja vacío. Alternativamente

go list -f '{{join .DepsErrors "\n"}}' <import-path>

Esperemos que muestre alguna información útil en su caso. Véase también la salida de

go help list

para obtener información adicional acerca de la herramienta de lista ir.

 mna23 abr. 2013 19:14
Definitivamente es bueno saberlo, en realidad ni siquiera sabía acerca de ir a la lista.
 MattyW03 mar. 2014 03:51
Las versiones más recientes de go le brindan más información sobre el origen del ciclo de importación.

depurar" problemas de referencias circulares), puede usarinversión de dependencia Romper esos ciclos, junto con la inyección de dependencia. Para una aplicación, siempre trato de seguir las pautas de laArquitectura limpia - veraquí para un ejemplo específico de Go, y encuentro que la "implementación no declarativa" de Go de las interfaces (es decir, no tiene que decir explícitamentetype MyStruct struct implements IfceSomething) hace esto muy simple.

Así que, si tienes paquetesA -> B -> C -> A, tu creasInterfaceA (Algún nombre relevante, obviamente, está más relacionado con el comportamiento que con el paquete :) en el paquete C y depende de esta interfaz en lugar del paquete A, y se asegura de que el paquete A "implementa" esta interfaz.

Luego, solo tiene que proporcionar una implementación concreta de A a C en algún momento (muchas posibilidades aquí, normalmente hago este código de "pegamento" en el paquete principal que conoce todas las dependencias).

medida que el código crece, estoy ansioso por saber cómo evitar el ciclo de importación de manera más eficiente en Go.

Otra opción es visualizar las dependencias en su proyecto. Esto se puede hacer con la herramienta CLIGodepgraph. Puedes instalarlo con:

go get -u github.com/kisielk/godepgraph

Y luego utilícelo para encontrar ciclos de importación en su aplicación con la ayuda de otra herramienta CLIGraphvis. Teniendo estas herramientas puedes visualizar dependencias de paquetes:

godepgraph -s path/to/my/package | dot -Tpng -o godepgraph.png
open ./godepgraph.png

Para encontrar ciclos en mi código:

Su respuesta a la pregunta