«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как обрабатывать одинаковые сигнатуры методов в разных пакетах в Go?

Как обрабатывать одинаковые сигнатуры методов в разных пакетах в Go?

Опубликовано 6 ноября 2024 г.
Просматривать:979

How to Handle Identical Method Signatures Across Different Packages in Go?

Обработка интерфейсов с одинаковыми сигнатурами методов в разных пакетах

В 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