Próbuję napisać otoki ogólnego przeznaczenia do subskrypcji, coś jak:Golang: Czy mogę rzucić do interfejsu chan {}
type Subscriber interface{
Subscribe(addr string) chan interface{}
}
Załóżmy, że istnieje biblioteka chcę użyć która ma subskrybować metody w to, ale który używa chan library.Object
. Chciałbym móc zrobić coś takiego:
func (s *mySubscriber) Subscribe(addr string) chan interface{}{
ch := make(chan library.Object)
library.Subscribe(addr, ch)
return chan interface{}(ch)
}
Obecnie nie wierzę, że taka obsada jest możliwa. I nie chcę modyfikować podstawowej biblioteki, ponieważ opakowanie powinno być agnostyczne dla implementacji biblioteki.
Widziałem już Is there a way to cast Structs for sending over a channel, ale w takim przypadku można zmodyfikować aplikację w zależności od potrzeb. Tutaj nie może. czy to możliwe? Czy istnieje lepszy sposób?
Jednym z rozwiązań jest przejście do kanału Subskrybuj w kanale ogólnego przeznaczenia i czekanie w nieokreślony sposób na chan library.Object
i wywoływanie wszystkiego, co pojawia się na moim ogólnym kanale, ale nie bardzo chciałem, aby wprowadzić inny kanał tylko po to, aby obejść typ rzucony.
Go nie ma pojęcia "cast". Wykonuj konwersje typu hase, wpisz asercje i interfejsy (i przełączniki typów) i to wszystko. Wpisz konwersje najbliżej do przesłania, np. C. Mówienie o rzucaniu niedziałających rzutów zamazuje twój pogląd na problem, który musi zostać rozwiązany przez użycie konwersji typu (nie będzie działać w twojej sytuacji!), Sprytne użycie interfejsów i odpowiednich typów asercji/przełączników może być połączone z odbicie. Większość rzeczy z "ogólnego przeznaczenia" w Go jest skazana na niepowodzenie lub zwalnianie przez klęczenie brodząc w odbiciu. – Volker