Go не является объектно-ориентированным. Форма only полиморфизма в Go - это интерфейсы.
Исходить из других объектно-ориентированных языков может быть сложно,потому что вам нужно избавиться от множества идей, которые вы можете попытаться воплотить - например, «базовые» классы / типы.Просто удалите «базу» из вашего дизайнерского мышления;Вы пытаетесь превратить композицию в наследство, и это только доставит вам неприятности.
В этом случае, возможно, у вас есть законное обоснование для композиции здесь;у вас есть некоторые общие общие поля, используемые несколькими типами, но это не «базовый» тип.Это может быть «метаданные» или что-то в этом роде - я не могу сказать, как это назвать, учитывая, что ваш пример довольно абстрактный, но вы поняли.
Так что, возможно, у вас есть:
type TXapi interface {
logicAndSaveTX()
}
type Metadata struct {
Field1 string
Field2 string
}
type RewardTX struct {
Metadata
}
func (tx RewardTX) logicAndSaveTX() {
// logic on BaseTX fields; simplified:
tx.Field1 = "overwritten"
tx.Field2 = "logic done"
// here would be marshal to json and save; simplified to print object:
fmt.Printf("saved this object: %+v \n", tx)
}
type AllowanceTX struct {
Metadata
AddField string
}
func (tx AllowanceTX) logicAndSaveTX() {
// logic on BaseTX fields; simplified:
tx.Field1 = "overwritten"
tx.Field2 = "logic done"
tx.AddField = "more stuff"
// here would be marshal to json and save; simplified to print object:
fmt.Printf("saved this object: %+v \n", tx)
}
Если обработка полей метаданных (или любых других) идентична во всех случаях использования, возможно, вы даете этому типу собственный метод logicTX
для заполнения этих полей, который может вызываться logicAndSaveTX
структур, которые его встраивают.
Ключевым моментом здесь является думать о поведении (методах) для типа, который будет ограничен этим типом , вместо того, чтобы думать о том, что он каким-то образом способен работать с "дочерними типами",Дочерние типы не существуют, и для типа, который является внедренным в другом типе, невозможно работать с его контейнером.