Maison >développement back-end >Golang >Comment puis-je transmettre des interfaces personnalisées aux plugins Go 1.8 ?

Comment puis-je transmettre des interfaces personnalisées aux plugins Go 1.8 ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-25 20:12:10311parcourir

How Can I Pass Custom Interfaces to Go 1.8 Plugins?

Le plugin Go 1.8 utilise une interface personnalisée

De nombreux plugins Go nécessitent la possibilité de leur transmettre des interfaces personnalisées complexes. Il n'est malheureusement pas actuellement possible de faire cela normalement dans l'implémentation d'origine du plugin.

Une façon d'éviter ce problème est de faire en sorte que le plugin renvoie une valeur de type interface{}. L'application principale peut alors définir l'interface qu'elle attend et utiliser l'assertion de type sur la valeur interface{} renvoyée par le plugin.

Par exemple, le code du plugin peut ressembler à ceci :

package main

import (
    "fmt"
)

type plgFilter struct{}

func (plgFilter) Name() string {
    return "Bob"
}

func (plgFilter) Age() int {
    return 23
}

func GetFilterIface() (f interface{}, err error) {
    f = plgFilter{}
    fmt.Printf("[plugin GetFilterIface] Returning filter: %T %v\n", f, f)
    return
}

Et le code principal de l'application pourrait ressembler à ceci :

package main

import (
    "fmt"
    "plugin"
)

func main() {
    p, err := plugin.Open("pg/pg.so")
    if err != nil {
        panic(err)
    }

    GetFilterIface, err := p.Lookup("GetFilterIface")
    if err != nil {
        panic(err)
    }

    filterIface, err := GetFilterIface.(func() (interface{}, error))()
    fmt.Printf("GetFilterIface result: %T %v %v\n", filterIface, filterIface, err)

    myfilter := filterIface.(MyFilter)
    fmt.Println("\tName:", myfilter.Name())
    fmt.Println("\tAge:", myfilter.Age())
}

type MyFilter interface {
    Name() string
    Age() int
}

Une autre solution consiste à définir l'interface dans un package en dehors du plugin, et le plugin et votre application peuvent l'importer et faites-y référence.
Par exemple, si l'interface est définie dans le package filter :

package filter

type Filter interface {
    Name() string
    Age() int
}

Alors le code du plugin pourrait ressembler à ceci :

package main

import (
    "fmt"
    "filter"
)

type plgFilter struct{}

func (plgFilter) Name() string {
    return "Bob"
}

func (plgFilter) Age() int {
    return 23
}

func GetFilter() (f filter.Filter, err error) {
    f = plgFilter{}
    fmt.Printf("[plugin GetFilter] Returning filter: %T %v\n", f, f)
    return
}

Et le principal le code de l'application pourrait ressembler à ceci :

package main

import (
    "fmt"
    "filter"
    "plugin"
)

func main() {
    p, err := plugin.Open("pg/pg.so")
    if err != nil {
        panic(err)
    }

    GetFilter, err := p.Lookup("GetFilter")
    if err != nil {
        panic(err)
    }

    filter, err := GetFilter.(func() (filter.Filter, error))()
    fmt.Printf("GetFilter result: %T %v %v\n", filter, filter, err)
    fmt.Println("\tName:", filter.Name())
    fmt.Println("\tAge:", filter.Age())
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn