>백엔드 개발 >Golang >**Go 플러그인과 호스트 애플리케이션 간에 사용자 정의 데이터 유형을 공유할 수 있습니까?**

**Go 플러그인과 호스트 애플리케이션 간에 사용자 정의 데이터 유형을 공유할 수 있습니까?**

Patricia Arquette
Patricia Arquette원래의
2024-10-26 10:16:02939검색

**Can You Share Custom Data Types Between Go Plugins and the Host Application?**

Go 플러그인의 사용자 정의 데이터 유형 공유

Go 플러그인에서는 Go 기호를 내보내고 호스트 애플리케이션에서 액세스할 수 있습니다. 그러나 사용자 정의 데이터 유형을 플러그인과 애플리케이션 간에 특히 구조체로 공유할 수 있는지 여부에 대한 의문이 제기됩니다.

유형 어설션 제한

얼핏 보면 유형을 사용하여 내보낸 기호를 특정 구조체로 변환하는 어설션은 간단해 보입니다. 예를 들면 다음과 같습니다.

import (
    "plugin"
)

// defined in plugin.so
type Person struct {
    Name string
}

func main() {
    // ... Establish connection to plugin ...
    sym, _ := plug.Lookup("P")
    var p Person
    p, ok := sym.(Person) // assertion attempt
    // ...
}

안타깝게도 이 시도는 "잘못된 기호 유형"을 나타내는 오류와 함께 런타임에 실패합니다. 이 오류 메시지는 기본 패키지에 정의된 식별자를 다른 패키지에서 참조할 수 없기 때문에 발생합니다. 따라서 플러그인에서 내보낸 식별자는 기본 애플리케이션의 식별자와 동일한 유형일 수 없습니다. 유형 정의가 동일하더라도 관련된 유형 개체가 다르기 때문에 유형 어설션이 실패합니다.

별도 패키지 접근 방식

이 제한을 피하기 위해 다음을 정의할 수 있습니다. 사용자 정의 데이터 유형을 별도의 패키지로 만들고 이를 플러그인과 기본 애플리케이션 모두로 가져옵니다. 이를 통해 두 구성 요소가 동일한 유형 정의를 공유할 수 있습니다.

예는 다음과 같습니다.

separate_pkg/filter/filter.go:

package filter

type Filter struct {
    Name string
    Age  int
}

plugin.go:

// import "separate_pkg/filter"

var MyFilter = filter.Filter{
    Name: "Bob",
    Age:  21,
}

// ...

main.go:

// import { "play/filter/filter", "plugin" }

func main() {
    p, _ := plugin.Open("plugin.so")
    mf, _ := p.Lookup("MyFilter")
    f, ok := mf.(*filter.Filter) // type assertion now succeeds
    // ...
}

위 내용은 **Go 플러그인과 호스트 애플리케이션 간에 사용자 정의 데이터 유형을 공유할 수 있습니까?**의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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