首頁 >後端開發 >Golang >## 您可以透過 Go 外掛程式鍵入斷言自訂資料類型嗎?

## 您可以透過 Go 外掛程式鍵入斷言自訂資料類型嗎?

Patricia Arquette
Patricia Arquette原創
2024-10-26 18:48:03898瀏覽

## Can You Type Assert a Custom Data Type From a Go Plugin?

你可以在 Go 外掛程式和應用程式之間共用自訂資料類型嗎?

在 Go 外掛程式開發中,可以尋求與在 Go 外掛程式中定義的自訂資料類型進行互動。來自主應用程式的插件。雖然檢索導出的符號並將它們表示為介面是可行的,但出現了問題:我們可以將它們鍵入自訂結構嗎?

直接答案是否定的,因為主套件無法存取其他套件中定義的識別碼。因此,插件中導出的標識符不能與應用程式共用相同的類型。即使插件和應用程式中具有相同的 Person 類型定義,類型斷言也會因其固有的區別而失敗。

但是,有一個解決方法。在單獨的包中定義類型允許其在插件和應用程式中使用。這將啟用自訂結構的類型斷言。

這是一個示例:

自定義類型定義:

<code class="go">package filter

type Filter struct {
    Name string
    Age  int
}</code>

插件代碼:

<code class="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">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>

執行此展示了成功的類型斷言和資料擷取:

&{Name:Bob Age:21}

必須注意插件中匯出的標識符之間的類型差異(MyFilter 的變數類型,CreateFilter 的函數類型)和從外掛程式尋找時獲得的符號類型(變數的指標類型,函數的相同類型)之間的類型差異。

透過利用此方法,開發人員可以在 Go 外掛程式和應用程式之間共用自訂資料類型,從而促進元件間的高效通訊。

以上是## 您可以透過 Go 外掛程式鍵入斷言自訂資料類型嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn