Как бороться с этим видом импортного цикла? - PullRequest
0 голосов
/ 04 мая 2018

Я довольно новичок в Go и упал на цикл импорта, который я не знаю, как мне решить. У меня есть несколько классов, которые реализуют определенный интерфейс. У меня также есть другой класс, который будет возвращать интерфейс, соответствующий конкретному идентификатору класса. Проблема приходит, когда какой-то конкретный класс должен использовать мой другой класс. Вот пример:

package examplepkg

import otherpkg

type ExampleClass {}

func NewExampleClass() *ExampleClass {
    return &ExampleClass{}
}

func (ex *ExampleClass) ExampleMethod() { // Implements ExampleInterface
    var id int // Read from some external source
    theinterface := otherpkg.GetExampleInterface(id)
    theinterface.ExampleMethod()
}

И функция в другом пакете:

package otherpkg

import examplepkg

func GetExampleInterface(id int) *ExampleInterface {
    switch id {
        case 3000: return examplepkg.NewExampleClass()
    }
}

Если вам нужно немного контекста, я читаю некоторые данные из источника, который я не создал, который инкапсулирует некоторые типы данных с помощью идентификаторов. Примером будет: id somedata id2 somedata2. И используя конкретный идентификатор, я могу вызвать метод, чтобы получить хороший тип данных и хороший размер. Они могут быть вложенными, поэтому я использую тот же метод ExampleMethod ().

Может ли кто-нибудь помочь мне ясно понять эту проблему в Go?

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Два способа сделать это:

  1. Создайте новый пакет, содержащий функции, общие для обоих, затем импортируйте этот пакет в оба пакета.

  2. Подумайте, принадлежат ли все они одному и тому же пакету вместо двух разных пакетов.

0 голосов
/ 04 мая 2018

Вы создаете пакет examplepkg, который импортирует otherpkg, когда компилятор читает этот файл, он сначала попытается решить импорт перед фактическим запуском кода внутри examplepkg.

Проблема в том, что ваш пакет otherpkg импортирует examplepkg, и, как я уже говорил ранее, он сначала попытается решить проблему импорта. Таким образом, компилятор вернется к examplepkg и попытается решить импорт, но снова приведет к otherpkg.

Это приводит к циклу импорта, с которым вы сталкиваетесь. Одним из решений этой проблемы является создание нового пакета, в котором вы объявляете свой тип ExampleClass и объявляете func NewExampleClass. Затем введите examplepkg и otherpkg для импорта из этого вновь созданного пакета, прервав цикл импорта, с которым вы сейчас сталкиваетесь.

...