У меня есть центральный пакет, который предоставляет несколько интерфейсов, от которых зависят другие пакеты (назовем один Client
). Эти другие пакеты предоставляют несколько реализаций этих первых интерфейсов (UDPClient
, TCPClient
). Я создаю экземпляр Client
, вызывая NewClient
в центральном пакете, и он выбирает и вызывает соответствующую реализацию клиента из одного из зависимых пакетов.
Это разваливается, когда я хочу рассказать центральный пакет об этих других пакетах, поэтому он знает, какие клиенты он может создать. Эти зависимые клиентские реализации также импортируют центральный пакет, создавая циклическую зависимость, которую Go не позволяет.
Какой лучший способ продвижения вперед? Я бы предпочел не сбрасывать все эти реализации в одном пакете, и создание отдельного пакета реестра кажется излишним. В настоящее время у меня есть каждый регистр реализации с центральным пакетом, но это требует, чтобы пользователь знал, чтобы импортировать каждую реализацию в каждом отдельном двоичном файле, использующем клиента.
import (
_ udpclient
_ tcpclient
client
)