首頁 > 後端開發 > Golang > 如何將自訂介面傳遞給 Go 1.8 插件?

如何將自訂介面傳遞給 Go 1.8 插件?

Linda Hamilton
發布: 2024-12-25 20:12:10
原創
275 人瀏覽過

How Can I Pass Custom Interfaces to Go 1.8 Plugins?

go 1.8 外掛程式使用自訂介面

許多 Go 外掛程式需要能夠將複雜的自訂介面傳遞給它們。不幸的是,目前在原始插件實作中無法正常執行此操作。

避免此問題的一種方法是將外掛程式傳回一個類型為interface{}的值。然後,主應用程式可以定義它期望的接口,並對插件返回的 interface{} 值使用類型斷言。

例如,插件程式碼可能如下所示:

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
}
登入後複製

主應用程式程式碼可能如下所示:

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
}
登入後複製

另一個解決方案是在插件外部的包中定義接口,並且插件和您的應用程式可以導入它並引用它。
例如,如果在套件過濾器中定義了介面:

package filter

type Filter interface {
    Name() string
    Age() int
}
登入後複製

那麼外掛程式碼可能如下所示:

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
}
登入後複製

主要應用程式程式碼可能如下所示:

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())
}
登入後複製

以上是如何將自訂介面傳遞給 Go 1.8 插件?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板