В Go при работе с несколькими интерфейсами с одинаковой сигнатурой метода, но определенными в разных пакетах, могут возникнуть ситуации, когда тип, реализующий оба интерфейса, приводит к неожиданному поведению.
Рассмотрим эти два интерфейса (Doer) и функции (FuncA и FuncB), определенные в разных пакетах:
// Package A
type Doer interface { Do() string }
func FuncA(doer Doer)
// Package B
type Doer interface { Do() string }
func FuncB(doer Doer)
Если тип C реализует Doer из обоих пакетов и реализация различается:
// Package main
type C int
func (c C) Do() string { return "A-specific implementation" }
func main() {
cA := C(0); A.FuncA(cA)
cB := C(0); B.FuncB(cB) // Behavior differs due to varying `Do()` implementations
}
Чтобы решить эту проблему, система типов Go делает упор на соответствие по имени и согласованность типов. Хотя он позволяет объекту удовлетворять нескольким интерфейсам, реализация общего метода должна соответствовать всем применимым контрактам интерфейса.
В приведенном выше сценарии обходной путь включает реализацию типов-оболочек:
// Package main
type DoerA struct { C C }
func (d DoerA) Do() string { return "A-specific implementation" }
type DoerB struct { C C }
func (d DoerB) Do() string { return "B-specific implementation" }
func main() {
cA := DoerA{C(0)}; A.FuncA(cA)
cB := DoerB{C(0)}; B.FuncB(cB) // Correct behavior with separate implementations
}
Создавая эти оболочки, вы можете управлять реализацией Do() на основе предполагаемого использования интерфейса, обеспечивая согласованность в соответствующих контекстах пакета.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3