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

Barbara Streisand
Lepaskan: 2024-10-29 14:14:02
asal
838 orang telah melayarinya

## 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>
Salin selepas log masuk
<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>
Salin selepas log masuk

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>
Salin selepas log masuk
<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>
Salin selepas log masuk
<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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!