Go 플러그인과 애플리케이션 간 사용자 정의 데이터 유형 공유
Go에서는 플러그인과 애플리케이션 간에 데이터를 공유하는 것이 가능합니다. 그러나 인터페이스가 아닌 사용자 정의 데이터 구조에 Assertion을 입력하는 것이 가능한지에 대한 의문이 제기됩니다.
사용자 정의 구조를 사용한 Type Assertion
다음 시나리오를 고려해보세요.
<code class="go">// plugin.go package main type Person struct { Name string } var ( P = Person{ Name: "Emma", } )</code>
<code class="go">// app.go package main import ( "fmt" "plugin" "os" ) func main() { plug, err := plugin.Open("./plugin.so") if err != nil { fmt.Println(err) os.Exit(1) } sym, err := plug.Lookup("P") if err != nil { fmt.Println(err) os.Exit(1) } var p Person p, ok := sym.(Person) if !ok { fmt.Println("Wrong symbol type") os.Exit(1) } fmt.Println(p.Name) }</code>
app.go 파일에서 Person에 기호 P를 입력하려고 하면 실행 시간 오류가 발생합니다: "잘못된 기호 유형."
해결책: 공통 유형 패키지
이 제한을 극복하려면 별도의 패키지에 사용자 정의 데이터 유형을 정의하고 이를 플러그인과 기본 애플리케이션 모두에서 사용하십시오.
<code class="go">// filter/filter.go package filter type Filter struct { Name string Age int }</code>
<code class="go">// plugin/main.go package main import ( "play/filter" ) var MyFilter = filter.Filter{ Name: "Bob", Age: 21, } func CreateFilter() filter.Filter { return filter.Filter{ Name: "Bob", Age: 21, } }</code>
<code class="go">// app/main.go package main import ( "fmt" "log" "os" "play/filter" "plugin" ) func main() { p, err := plugin.Open("plugin.so") if err != nil { log.Fatal(err) } mf, err := p.Lookup("MyFilter") if err != nil { log.Fatal(err) } f, ok := mf.(*filter.Filter) if !ok { log.Fatal("Wrong symbol type") } fmt.Printf("%+v\n", f) }</code>
이 예에서 필터 유형은 별도의 패키지에 정의되어 플러그인과 기본 애플리케이션 모두에 액세스할 수 있습니다. 결과적으로 플러그인 기호에서 *filter.Filter에 대한 유형 어설션이 성공합니다.
참고:
위 내용은 ## Go 플러그인에서 사용자 정의 데이터 구조를 입력할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!