0Pricing
Go Academy · Lección

Diseño de una interfaz de plugin

Contratos de interfaz compartidos entre el host y el plugin

Diseño de una interfaz de plugin es una lección gratuita de Go Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Go Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Go Academy incluye 4 lecciones en total.

Plugins basados en interfaces

Defina una interfaz estable de Go que los plugins deban implementar. El host carga el plugin, obtiene la implementación y la invoca mediante la interfaz, sin hacer aserciones de tipo en cada método.

type Processor interface {
    Name() string
    Process(ctx context.Context, data []byte) ([]byte, error)
}

Punto de entrada del plugin

Cada plugin exporta un símbolo conocido (por ejemplo, Plugin) que devuelve la implementación de la interfaz:

// In the plugin:
var Plugin processor // exported symbol

type processor struct{}
func (p processor) Name() string { return "my-processor" }
func (p processor) Process(ctx context.Context, data []byte) ([]byte, error) {
    return bytes.ToUpper(data), nil
}

Carga mediante una interfaz

En el host, cargue el símbolo y haga una aserción al tipo de la interfaz:

sym, _ := p.Lookup("Plugin")
proc, ok := sym.(Processor)
if !ok { log.Fatal("plugin does not implement Processor") }

Patrón de registro

Mantenga un registro de los plugins cargados por nombre:

var registry = map[string]Processor{}

func register(p Processor) { registry[p.Name()] = p }
func get(name string) (Processor, bool) {
    p, ok := registry[name]
    return p, ok
}

Versionado de interfaces

Añada un método Version() a la interfaz para que el host pueda verificar la compatibilidad antes de registrar el plugin.

type Versioned interface {
    APIVersion() string
}
if v, ok := proc.(Versioned); ok && v.APIVersion() != "1.0" {
    log.Fatalf("incompatible plugin version: %s", v.APIVersion())
}

Contexto y cancelación

Propague el contexto a través de las llamadas a los métodos del plugin para que el host pueda cancelar operaciones prolongadas del plugin durante el apagado o cuando se agote el tiempo de espera de una solicitud.

Contrato de gestión de errores

Defina si los plugins deben provocar un pánico o devolver errores cuando se produce un fallo. Devolver errores es más seguro: es posible que el middleware recover del plugin no pueda interceptar los pánicos en el host.

Configuración

Pase la configuración a los plugins durante la carga mediante un método Init(config map[string]string) error. Así se separa la creación del plugin de su configuración.

Gestión del ciclo de vida

Añada Close() error a la interfaz para los plugins que mantengan recursos (conexiones de DB, goroutines) que deban limpiarse durante el apagado.

Probar plugins de forma independiente

Pruebe directamente la implementación del plugin (como paquete de Go) sin cargar el binario .so. La interfaz facilita las pruebas con mocks.

Contrato de documentación

Documente claramente el contrato de la interfaz: qué métodos se llaman y cuándo, las garantías de concurrencia y qué se considera un error frente a una condición fatal.

Comprobación rápida

¿Por qué definir una interfaz estable de Go para los plugins en lugar de buscar símbolos de funciones individuales?

Repaso: diseño de interfaces para plugins

Puntos clave:

  • Defina una interfaz estable que el plugin deba implementar
  • Exporte un símbolo conocido (var Plugin InterfaceType) desde el plugin
  • Haga una única aserción de tipo durante la carga; todas las llamadas serán seguras respecto a tipos mediante la interfaz
  • Añada Version(), Init() y Close() para gestionar el ciclo de vida

Preguntas frecuentes

¿La lección «Diseño de una interfaz de plugin» es gratis?

Sí — el texto completo de «Diseño de una interfaz de plugin» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Go Academy, actualiza a CoddyKit PRO. El curso de Go Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Diseño de una interfaz de plugin»?

Contratos de interfaz compartidos entre el host y el plugin Practicas Go Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Go Academy?

No se requiere experiencia previa. Go Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.

¿Cuánto tiempo toma la lección «Diseño de una interfaz de plugin»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Go Academy?

Sí. Cada lección de Go Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Fundamentos del package plugin de Go
  2. Diseño de una interfaz de plugin
  3. Carga dinámica y símbolos
  4. Alternativas: HashiCorp go-plugin
← Volver a Go Academy