Как использовать общий интерфейс Go между пакетами, если типом интерфейса является этот интерфейс - PullRequest
0 голосов
/ 24 октября 2019

Предположим, у нас есть файлы из пакетов a и b

package a

type Common interface {
    GetSelf() Common
}

type Foo struct{}

func (f Foo) GetSelf() Common {
    return f
}

func IsCommon(c interface{}) bool {
    _, ok := c.(Common)
    return ok
}
package b

type Common interface {
    GetSelf() Common
}

type Bar struct{}

func (b Bar) GetSelf() Common {
    return b
}

func IsCommon(c interface{}) bool {
    _, ok := c.(Common)
    return ok
}

, которые используются в тесте пакета

package main

import (
    "test/a"
    "test/b"
)

func main() {
    println("hey")
    csa := a.Foo{}
    csb := b.Bar{}

    if a.IsCommon(csa) {
        println("csa is Common of a")
    } else {
        println("csa is not Common of a")
    }

    if b.IsCommon(csa) {
        println("csa is Common of b")
    } else {
        println("csa is not Common of b")
    }

    if a.IsCommon(csb) {
        println("csb is Common of a")
    } else {
        println("csb is not Common of a")
    }

    if b.IsCommon(csb) {
        println("csb is Common of b")
    } else {
        println("csb is not Common of b")
    }
}

Вывод этого:

csa is Common of a
csa is not Common of b
csb is not Common of a
csb is Common of b

Я понимаю, что структуры нарушают сигнатуру функции GetSelf() Common другого пакета, поскольку возвращаемое значение a.Common отличается от b.Common. Есть ли способ иметь интерфейс с методом, который возвращает сам себя, но не должен быть импортирован из другого пакета?

Я пытаюсь это сделать, потому что я пытаюсь реализовать древовидную структуру, которая имеетузлы с дочерними элементами одного и того же интерфейса, но возможны варианты типа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...