Go 플러그인과 기본 애플리케이션 간에 사용자 정의 데이터 유형을 공유하는 방법은 무엇입니까?

Patricia Arquette
풀어 주다: 2024-10-28 00:23:29
원래의
801명이 탐색했습니다.

How to Share Custom Data Types Between Go Plugins and the Main Application?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!