인터페이스에 플러그인 바인딩: 수수께끼
Go에서는 특정 인터페이스를 구현하는 플러그인을 만드는 것이 가능합니다. 그러나 인터페이스를 플러그인 심볼로 반환할 때 특이한 동작이 있습니다. 이 문제를 자세히 조사하고 해결책을 찾아보겠습니다.
인터페이스 및 플러그인:
다양한 방법으로 IPlugin 인터페이스를 정의하고 testpl 구조체가 포함된 플러그인을 만듭니다. 그것을 구현합니다. 처음에는 세 가지 다른 getPlugin 함수가 있습니다.
조회 문제:
해결책은 Plugin.Lookup()의 작동 방식을 이해하는 데 있습니다. 조회 중인 기호에 대한 포인터를 반환합니다. 플러그인이 변수(예: Greeter)를 노출하는 경우 Sym에 저장된 값은 변수에 대한 포인터입니다.
플러그인 기호를 인터페이스에 바인딩하려고 할 때 문제가 발생합니다. 인터페이스에 대한 포인터 유형의 값은 빈 인터페이스를 제외한 어떤 인터페이스도 만족하지 않습니다. 따라서 iface.IPlugin 유형의 값에서 iface.IPlugin 유형을 입력하려고 하면 항상 실패합니다.
해결책:
이 문제를 해결하려면 다음 중 하나를 수행해야 합니다.
pgPtr, ok := sym.(*iface.IPlugin) if !ok { panic(errors.New("error binding plugin to interface")) } pg := *pgPtr
위 내용은 인터페이스를 Go 플러그인 기호로 반환하는 것이 실패하는 이유는 무엇이며 어떻게 해결할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!