@tuerxor

Как правильно использовать импорт в Go?

Например, у меня есть package module, который взаимодействует с разными API. Соответственно иерархия у меня примерно такая:
- module // директория модуля

-- api1 // директория с api1
--- api.go // взаимодействие с api1

-- api2 // директория с api2
--- api.go // взаимодействие с api2

-- api.go // интерфейс для api
-- response.go // структура ответа, который должен вернуть модуль
-- request.go // структура запроса, которой принимает модуль
-- handler.go // принимает запрос, отдает его API, собирает ответ и возвращает общий


Соответственно, вопрос, как мне в api1/api.go (или api2/api.go) использовать хотя бы интерфейс api.go? Например, у меня есть метод, который должен вернуть интерфейс, описанный в api.go, но этот метод находится в api2/api.go, но я не могу его вернуть, потому что если сделаю import "../", то, конечно же, появится цикл. Подскажите, что в этом случае делать? Возможно, я не очень правильно строю структуру, но логика же проста - есть интерфейс и есть реализации, которые его реализуют, почему в реализациях нельзя на него ссылаться? Также не понятно, как работать с общим объектом Response, который также активно используется в реализациях api.
  • Вопрос задан
  • 245 просмотров
Решения вопроса 1
nikonor
@nikonor
Программист go, perl
по-моему, правильнее сделать api/ (или common/), перенести туда api.go, response.go и т.д. чтобы иметь простой способ доступаться до них. в корне же иметь просто некий общий роутер.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
mukizu
@mukizu
Касательно структуры - можно почитать разные тексты на эту тему и определиться с тем, как поступить грамотнее.

>почему в реализациях нельзя на него ссылаться?

А зачем на него там ссылаться? Интерфейс по сути просто описывает условия, которым что-то должно удовлетворять.

Например в api.go у вас что-то такое:
type CommonApi interface {
	Request() error
}


api1.go
import "errors"

type Api struct {}

func (Api) Request() error  {
	return errors.New("Test")
}


А в handler.go нечто вроде:
import "<path>/api/v1"

func handle(c CommonApi) error{
	return c.Request()
}

func main()  {
	api := v1.Api{}
	handle(api)
}


Всё.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы