Я пытаюсь использовать интерфейсы в Go, чтобы получить два преимущества:
- Защитить себя от смешивания переменных порядка
- Сделать пакет независимым друг от друга, поэтому один день, я могу легко заменить один из них.
В моем конкретном случае я могу найти обходной путь, но я не могу понять, почему тот способ, который я пытаюсь, не работает, это кажется простым и логичным.
Вот что я делаю.
В одном пакете (именованные обработчики) у меня есть интерфейс, описывающий нужную мне функцию, просто что-то получает Account
.
package handlers
type Accounter interface {
AddAccount(a Account)
}
type Account interface {
AccountID() int64
UserID() int64
OtherID() int64
}
В другом пакете моей программы (с именем accounter) у меня есть функция, соответствующая интерфейсу, и определение интерфейса Account
, чтобы избежать импорта этого интерфейса из первого пакета.
package accounter
type Account interface {
AccountID() int64
UserID() int64
OtherID() int64
}
func (x *accounter) AddAccount(a Account) {
...
}
Но go vet
сообщает мне, что Я не могу сделать такое:
configure_stats_loader.go:109:64: cannot use x (type *accounter.Accounter) as type handlers.Accounter in argument to handlers.AddAccHandler:
*accounter.Accounter does not implement handlers.Accounter (wrong type for AddAccount method)
have AddAccount(accounter.Account)
want AddAccount(handlers.Account)
В этом случае у меня есть решения:
- Импортировать
Account
интерфейс из одного из пакетов. - Определить функцию получения значений в стандарте go тип например,
(UserID, AccoutID, OtherID int64)
.
В первом случае я теряю независимость в пакетах, и в будущем я не смогу заменить интерфейс Accounter
, не переписав код (не так много кода, но все же) , во втором случае, если у меня будет много похожих методов и много параметров в Account
, я могу случайно перепутать порядок переменных. Например, случайно используйте AccountID
как UserID
.
А теперь вопрос: есть ли способ получить все преимущества? Получите защиту от смешивания порядка переменных и избегайте импорта из одного пакета в другой.