>백엔드 개발 >Golang >Go 플러그인이 인터페이스를 직접 반환하지 못하는 이유는 무엇이며, 이 문제를 어떻게 해결할 수 있습니까?

Go 플러그인이 인터페이스를 직접 반환하지 못하는 이유는 무엇이며, 이 문제를 어떻게 해결할 수 있습니까?

Barbara Streisand
Barbara Streisand원래의
2024-11-24 05:51:10300검색

Why Do Go Plugins Fail to Return Interfaces Directly, and How Can This Be Resolved?

함수 반환으로서의 플러그인 기호

Go에서는 두 패키지 외부에서 정의된 공통 인터페이스를 구현하는 플러그인을 가져올 수 있습니다. 플러그인에서 구조체를 반환하면 인터페이스가 올바르게 구현됩니다. 그러나 Go 플러그인 시스템의 특정 기술로 인해 인터페이스를 직접 반환하려는 시도는 실패합니다.

그 이유는 플러그인 기호의 특성에 있습니다. Plugin.Lookup()을 사용하여 플러그인에서 Greeter라는 변수를 조회하면 해당 변수에 대한 포인터가 반환됩니다. 이는 플러그인 내에서 변수를 변경할 수 있도록 하는 데 필요합니다.

sym에 저장된 값의 유형을 인쇄하면 해당 값이 인터페이스(iface.IPlugin)에 대한 포인터인지 또는 실제 인터페이스 값(iface.IPlugin). 구조체를 반환하는 플러그인의 경우 Sym에 저장된 값은 iface.IPlugin을 구현하는 main.testpl 유형이므로 유형 어설션이 성공합니다.

그러나 플러그인이 iface를 반환하면 .IPlugin, Sym에 저장된 값은 *iface.IPlugin 유형입니다. 인터페이스 값에 대한 이 포인터는 iface.IPlugin을 포함하여 어떤 인터페이스도 직접 만족시키지 않습니다. 따라서 유형 어설션이 실패합니다.

이 문제를 우회하려면 플러그인을 수정하여 전역 변수 대신 Greeter 인터페이스를 반환하는 함수를 노출할 수 있습니다.

func Greeter() iface.IPlugin { return testpl{} }

이렇게 하면 노출됩니다. func() iface.IPlugin 유형의 Greeter라는 기호입니다. Plugin.Lookup()을 사용하여 조회하면 함수 포인터가 반환됩니다. 이렇게 하면 인터페이스 값에 대한 포인터가 필요하지 않으며 올바른 유형 어설션이 가능합니다.

greeterFunc, ok := GetFilter.(func() iface.IPlugin)
if !ok {
    panic(errors.New("not of expected type"))
}
greeter := greeterFunc()

이 방법은 인터페이스를 직접 반환하는 것과 관련된 함정을 피하면서 플러그인 기능을 노출하는 더 명확하고 일관된 접근 방식을 제공합니다. 플러그인에서.

위 내용은 Go 플러그인이 인터페이스를 직접 반환하지 못하는 이유는 무엇이며, 이 문제를 어떻게 해결할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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