не важно в этом случае).
и есть пачка методов, которые ну прям тютелька в тютельку одинаковые. и надо бы сделать какую-то общую структуру, где поместятся те одинаковые методы и уже от этой структуры "отнаследую" те 2 вида бриджа.
...так бы я думал в языках, где наследование поддерживается. а в го как надо думать в данной ситуации? не копипастить же методы?))
сейчас я сделал так. как описал выше иии... чет мне кажется, что это прям настолько костыль, что более костыля я в жизни не видал)
блин, жаль нельзя скрины скинуть, крч сделал структуру
package networks
type CommonBridge struct {
Bridge
Client *ethclient.Client
...
}
где Bridge это интерфейс. и "отнаследовал" бриджы для двух сетей типа
package eth
type Bridge struct {
networks.CommonBridge
...
}
и нагуглил такое решение, шо костыль костылём
package eth
func New(...) (*Bridge, error) {
...
b := &Bridge{...}
b.CommonBridge.Bridge = b
}
b.CommonBridge.Bridge = b - это всё таки костыль или не костыль?) или в го принято вообще по другому мою проблему решать?) подскажите)
Какую проблему вы пытаетесь решить в итоге?
избежания дублирования кода
Нужно больше контекста
У вас Bridge то интерфейс, то структура. И самое главное, ничего не понятно что именно в доменной области вы пытаетесь сделать
ну допустим есть две несвязанные между собой структуры type Cat struct{} type Dog struct{} и есть у них одинаковый метод func (c *Cat) eat() {fmt.Println("eat")} func (c *Dog) eat() {fmt.Println("eat")}
Вынести общий код в обычную функцию и вызывать ее внутри методов?
тот код вызывает другие методы этой структуры, мне эти методы тоже сделать обычными функциями получается?)
Если структуры никак не связаны, не надо обобщать их код ради "избегания дублежки"
type Common struct{} func (c *Common) eat() {fmt.Println("eat")} type Cat struct{ Common } type Dog struct{ Common }
ну как не связаны, они типа общей логикой связаны - у меня два "моста"
Мне кажется, для начала нужно ответить на вопрос: если у них одинаковые методы с одинаковой логикой - почему это разные структуры?
Вместо скринов можно использовать https://go.dev/play/
Обсуждают сегодня