>  기사  >  백엔드 개발  >  인터페이스를 Go 플러그인 기호로 반환하는 것이 실패하는 이유는 무엇이며 어떻게 해결할 수 있습니까?

인터페이스를 Go 플러그인 기호로 반환하는 것이 실패하는 이유는 무엇이며 어떻게 해결할 수 있습니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-21 17:48:14847검색

Why Does Returning an Interface as a Go Plugin Symbol Fail, and How Can It Be Fixed?

인터페이스에 플러그인 바인딩: 수수께끼

Go에서는 특정 인터페이스를 구현하는 플러그인을 만드는 것이 가능합니다. 그러나 인터페이스를 플러그인 심볼로 반환할 때 특이한 동작이 있습니다. 이 문제를 자세히 조사하고 해결책을 찾아보겠습니다.

인터페이스 및 플러그인:

다양한 방법으로 IPlugin 인터페이스를 정의하고 testpl 구조체가 포함된 플러그인을 만듭니다. 그것을 구현합니다. 처음에는 세 가지 다른 getPlugin 함수가 있습니다.

  • 첫 번째 함수는 testpl 구조체를 직접 반환하며 예상대로 작동합니다.
  • 두 번째 함수는 testpl을 IPlugin 인터페이스로 반환하지만 다음과 같은 경우 실패합니다. 플러그인 기호를 바인딩합니다.
  • 세 번째는 일반 인터페이스{}를 반환합니다. 실패합니다.

조회 문제:

해결책은 Plugin.Lookup()의 작동 방식을 이해하는 데 있습니다. 조회 중인 기호에 대한 포인터를 반환합니다. 플러그인이 변수(예: Greeter)를 노출하는 경우 Sym에 저장된 값은 변수에 대한 포인터입니다.

플러그인 기호를 인터페이스에 바인딩하려고 할 때 문제가 발생합니다. 인터페이스에 대한 포인터 유형의 값은 빈 인터페이스를 제외한 어떤 인터페이스도 만족하지 않습니다. 따라서 iface.IPlugin 유형의 값에서 iface.IPlugin 유형을 입력하려고 하면 항상 실패합니다.

해결책:

이 문제를 해결하려면 다음 중 하나를 수행해야 합니다.

  • 다음 중 하나를 수행하는 플러그인에서 함수를 반환합니다. 인사하는 사람(Greeter() iface.IPlugin)을 반환합니다. 이렇게 하면 Greeter 기호를 조회할 때 값에 대한 포인터를 반환하기 위해 플러그인 패키지가 필요하지 않은 func() iface.IPlugin 유형이 됩니다.
  • 플러그인 기호 포인터를 다음으로 역참조합니다. iface.IPlugin 유형의 값을 얻습니다. 이는 다음과 같이 수행할 수 있습니다:
pgPtr, ok := sym.(*iface.IPlugin)
if !ok {
    panic(errors.New("error binding plugin to interface"))
}
pg := *pgPtr

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

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