首頁 >後端開發 >Golang >如何透過 Go 1.8 插件使用自訂介面?

如何透過 Go 1.8 插件使用自訂介面?

Susan Sarandon
Susan Sarandon原創
2024-12-27 19:02:09265瀏覽

How Can I Use Custom Interfaces with Go 1.8 Plugins?

在 Go 1.8 外掛程式中使用自訂介面

在 Go 1.8 中,外掛程式可以使用自訂介面。但是,有一些限制需要考慮。

使用外部套件

一種方法是在外部套件中定義接口,然後讓插件和主應用程式導入它。

例如,在名為filter的套件中建立一個介面:

package filter

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

在外掛程式中,匯入filter套件並實作介面:

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())
}

這種方法確保插件可以存取介面定義。

回傳介面{}

另一個選項是讓外掛程式回傳介面{}類型的值。然後,主應用程式可以定義它期望的接口,並對返回值使用類型斷言。

例如,在插件中:

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
}

這種方法提供了更大的靈活性,但需要在主程式中進行類型斷言application.

限制

請注意,自訂介面僅在插件外部定義的情況下才有效。這是因為 Go 插件是獨立的模組,無法存取其他套件中定義的類型。

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

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn