Rumah  >  Artikel  >  pembangunan bahagian belakang  >  ## Bolehkah Anda Menaip Tegaskan Struktur Data Tersuai dalam Pemalam Go?

## Bolehkah Anda Menaip Tegaskan Struktur Data Tersuai dalam Pemalam Go?

Barbara Streisand
Barbara Streisandasal
2024-10-29 14:14:02890semak imbas

## Can You Type Assert Custom Data Structures in Go Plugins?

Perkongsian Jenis Data Tersuai Antara Pemalam Go dan Aplikasi

Dalam Go, adalah mungkin untuk berkongsi data antara pemalam dan aplikasi. Walau bagaimanapun, persoalan timbul sama ada boleh dilakukan untuk menaip assert ke dalam struktur data tersuai berbanding antara muka.

Taip Penegasan dengan Struktur Tersuai

Pertimbangkan senario ini:

<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>

Apabila cuba menaip menegaskan simbol P kepada Orang dalam fail app.go, anda akan menghadapi ralat masa pelaksanaan: "Jenis simbol salah."

Penyelesaian: Pakej Jenis Biasa

Untuk mengatasi had ini, tentukan jenis data tersuai dalam pakej berasingan dan gunakannya dalam kedua-dua pemalam dan aplikasi utama.

<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>

Dalam contoh ini, jenis Penapis ditakrifkan dalam pakej yang berasingan, menjadikannya boleh diakses oleh pemalam dan aplikasi utama. Akibatnya, taip penegasan daripada simbol pemalam kepada *penapis.Penapis berjaya.

Perhatikan bahawa:

  • Pembolehubah yang ditakrifkan dalam pakej utama tidak boleh dirujuk daripada pakej lain, jadi elakkan menggunakan jenis yang sama dalam pemalam dan aplikasi utama secara langsung.
  • Simbol yang mewakili pembolehubah dikembalikan sebagai penunjuk, membolehkan anda mengubah suai nilainya.
  • Fungsi mengembalikan nilai bukan jenis penuding boleh dicari dengan penuding fungsi.
  • Menukar pakej jenis biasa memerlukan membina semula pemalam.

Atas ialah kandungan terperinci ## Bolehkah Anda Menaip Tegaskan Struktur Data Tersuai dalam Pemalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn