Go 플러그인의 사용자 정의 데이터 유형 공유
Go에서는 플러그인에서 사용자 정의 데이터 유형을 정의할 수 있습니다. 그러나 플러그인과 기본 애플리케이션 간에 이러한 데이터 유형을 공유하려면 신중한 고려가 필요합니다.
기호 조회의 한계
플러그인에서 내보낸 기호에 액세스할 때 다음을 수행할 수 있습니다. 이를 인터페이스에 입력하세요. 그러나 기호 조회만 사용하여 이를 구조체에 직접 입력하는 것은 불가능합니다.
예로 사용자 정의 데이터 유형
다음 예를 고려해 보겠습니다.
<code class="go">// plugin.go package main type Person struct { Name string } var P Person = Person{ Name: "Emma", }</code>
<code class="go">// app.go package main import ( "fmt" "os" "plugin" ) 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) // Panic: "Wrong symbol type" }</code>
이 예에서 P 기호는 Person 구조체입니다. 하지만 기본 앱의 유형 어설션이 오류와 함께 실패합니다.
해결책: 별도의 유형 정의
플러그인과 플러그인 간에 사용자 정의 데이터 유형을 공유하는 핵심 주요 응용 프로그램은 유형을 별도로 정의하는 것입니다. 이렇게 하면 플러그인과 메인 앱 모두 동일한 유형 정의를 참조할 수 있습니다.
별도의 유형 정의를 사용한 예
<code class="go">// type.go package filter type Filter struct { Name string Age int }</code>
<code class="go">// plugin.go package main import "play/filter" var MyFilter filter.Filter = filter.Filter{ Name: "Bob", Age: 21, } func CreateFilter() filter.Filter { return filter.Filter{ Name: "Bob", Age: 21, } }</code>
<code class="go">// app.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) // Output: &{Name:Bob Age:21} }</code>
별도의 패키지에 필터 유형을 정의하면 플러그인과 기본 앱이 이를 가져와서 유형 어설션에 사용할 수 있습니다.
위 내용은 Go 플러그인과 기본 애플리케이션 간에 사용자 정의 데이터 유형을 공유하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!