>백엔드 개발 >Golang >Go 1.8 플러그인에 사용자 정의 인터페이스를 어떻게 전달할 수 있나요?

Go 1.8 플러그인에 사용자 정의 인터페이스를 어떻게 전달할 수 있나요?

Linda Hamilton
Linda Hamilton원래의
2024-12-25 20:12:10276검색

How Can I Pass Custom Interfaces to Go 1.8 Plugins?

go 1.8 플러그인 사용자 정의 인터페이스 사용

많은 Go 플러그인에는 복잡한 사용자 정의 인터페이스를 전달하는 기능이 필요합니다. 안타깝게도 현재 원래 플러그인 구현에서는 이 작업을 정상적으로 수행할 수 없습니다.

이 문제를 방지하는 한 가지 방법은 플러그인이 인터페이스{} 유형의 값을 반환하도록 만드는 것입니다. 그런 다음 기본 애플리케이션은 예상하는 인터페이스를 정의하고 플러그인이 반환한 인터페이스 값에 대해 유형 어설션을 사용할 수 있습니다.

예를 들어 플러그인 코드는 다음과 같습니다.

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.