Sto cercando di scrivere un wrapper di uso generale per gli abbonamenti, qualcosa come:Golang: Posso lanciare all'interfaccia chan {}
type Subscriber interface{
Subscribe(addr string) chan interface{}
}
Supponiamo che ci sia una libreria che voglio usare, che ha un metodo sottoscrivere in esso, ma che utilizza un chan library.Object
. Vorrei poter fare qualcosa del tipo:
func (s *mySubscriber) Subscribe(addr string) chan interface{}{
ch := make(chan library.Object)
library.Subscribe(addr, ch)
return chan interface{}(ch)
}
Attualmente, non credo che un tale cast sia possibile. E non voglio modificare la libreria sottostante, dal momento che il wrapper dovrebbe essere agnostico alle implementazioni della libreria.
Ho visto Is there a way to cast Structs for sending over a channel, ma in tal caso l'applicazione può essere modificata in base alle esigenze. Qui, non può. È possibile? C'è un modo migliore?
Una soluzione è passare in un canale di uso generale in Iscriviti e attendere indefinitamente su chan library.Object
e attivare tutto ciò che viene visualizzato sul mio canale generale, ma non mi è piaciuto particolarmente dover introdurre un altro canale solo per spostarsi il cast del tipo.
Go non ha il concetto di "cast". Vai conversioni di tipo hase, asserzioni di tipo e interfacce (e interruttori di tipo) e il gioco è fatto. Digita le conversioni più vicine al cast, ad es. C. Parlare di cast e cast non funzionanti non farà altro che sfocare la tua visione del problema che deve essere affrontato usando le conversioni di tipo (non funzionerà nella tua situazione!), L'uso intelligente delle interfacce e gli asserzioni/interruttori di tipo appropriato magari combinati con riflessione. La maggior parte della roba "per uso generale" in Go è destinata a fallire o a rallentare con il ginocchio che guada in riflessione. – Volker