In Node.js sono riuscito a creare un clone WordPress piuttosto facilmente utilizzando EventEmitter per replicare e creare un sistema hooks nel core CMS, a cui i plugin potevano quindi collegarsi.Eventi Golang: EventEmitter/dispatcher per architettura plug-in
Ora ho bisogno di questo stesso livello di estensibilità e isolamento del nucleo per il mio CMS scritto e portato su Go. Fondamentalmente ora ho il core finito, ma per renderlo veramente flessibile devo essere in grado di inserire eventi (hook) e di avere dei plugin collegati a questi hook con funzionalità aggiuntive.
Non mi interessa la ricompilazione (collegamento dinamico/statico), a patto che non sia necessario modificare il core per caricare i plugin: il core CMS non dovrebbe mai essere modificato. (Come WP, Drupal ecc)
ho notato che ci sono un paio di progetti, piuttosto sconosciuti, cercando di attuare gli eventi in andare a cercare in qualche modo simili a EventEmitter in Node.js:
https://github.com/CHH/eventemitter
https://github.com/chuckpreslar/emission
Dato che quei 2 progetti sopra non hanno guadagnato molta popolarità e attenzione, in qualche modo penso che questo modo di pensare agli eventi potrebbe essere come dovremmo farlo in Go? Questo significa che Go non è forse adatto a questo compito? Per rendere le applicazioni veramente estendibili tramite plugin?
Non sembra che gli eventi di Go si siano integrati nel suo nucleo e RPC non sembra una soluzione valida per l'integrazione di plug-in nell'applicazione principale come se fossero stati creati in modo nativo e come se fossero parte del principale applicazione stessa.
Qual è il modo migliore per integrare i plug-in senza soluzione di continuità nell'app principale, per i punti di estensione illimitati (nel core) senza manipolare il core ogni volta che è necessario collegare un nuovo plug-in?
Vedere i pacchetti database/sql e database/sql/driver per un esempio di architettura di plugin. In questa architettura, plugins [register] (http://godoc.org/database/sql#Register) dalle funzioni init() e implementa interfacce come definito dal pacchetto driver. –