Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Meluluskan Antara Muka Tersuai ke Pemalam 1.8?

Bagaimanakah Saya Boleh Meluluskan Antara Muka Tersuai ke Pemalam 1.8?

Linda Hamilton
Linda Hamiltonasal
2024-12-25 20:12:10276semak imbas

How Can I Pass Custom Interfaces to Go 1.8 Plugins?

pemalam go 1.8 menggunakan antara muka tersuai

Banyak pemalam Go memerlukan keupayaan untuk menghantar antara muka tersuai yang kompleks ke dalamnya. Malangnya, pada masa ini tidak mungkin untuk melakukan ini secara normal dalam pelaksanaan pemalam asal.

Satu cara untuk mengelakkan masalah ini ialah dengan menjadikan pemalam mengembalikan nilai antara muka jenis{}. Aplikasi utama kemudiannya boleh mentakrifkan antara muka yang diharapkan dan menggunakan penegasan jenis pada nilai antara muka{} yang dikembalikan oleh pemalam.

Sebagai contoh, kod pemalam mungkin kelihatan seperti ini:

package main

import (
    "fmt"
)

type plgFilter struct{}

func (plgFilter) Name() string {
    return "Bob"
}

func (plgFilter) Age() int {
    return 23
}

func GetFilterIface() (f interface{}, err error) {
    f = plgFilter{}
    fmt.Printf("[plugin GetFilterIface] Returning filter: %T %v\n", f, f)
    return
}

Dan kod aplikasi utama mungkin kelihatan seperti ini:

package main

import (
    "fmt"
    "plugin"
)

func main() {
    p, err := plugin.Open("pg/pg.so")
    if err != nil {
        panic(err)
    }

    GetFilterIface, err := p.Lookup("GetFilterIface")
    if err != nil {
        panic(err)
    }

    filterIface, err := GetFilterIface.(func() (interface{}, error))()
    fmt.Printf("GetFilterIface result: %T %v %v\n", filterIface, filterIface, err)

    myfilter := filterIface.(MyFilter)
    fmt.Println("\tName:", myfilter.Name())
    fmt.Println("\tAge:", myfilter.Age())
}

type MyFilter interface {
    Name() string
    Age() int
}

Penyelesaian lain ialah untuk menentukan antara muka dalam pakej di luar pemalam, dan kedua-dua pemalam dan aplikasi anda boleh mengimportnya dan merujuk kepadanya.
Sebagai contoh, jika antara muka ditakrifkan dalam penapis pakej:

package filter

type Filter interface {
    Name() string
    Age() int
}

Maka kod pemalam mungkin kelihatan seperti ini:

package main

import (
    "fmt"
    "filter"
)

type plgFilter struct{}

func (plgFilter) Name() string {
    return "Bob"
}

func (plgFilter) Age() int {
    return 23
}

func GetFilter() (f filter.Filter, err error) {
    f = plgFilter{}
    fmt.Printf("[plugin GetFilter] Returning filter: %T %v\n", f, f)
    return
}

Dan kod aplikasi utama mungkin kelihatan seperti ini:

package main

import (
    "fmt"
    "filter"
    "plugin"
)

func main() {
    p, err := plugin.Open("pg/pg.so")
    if err != nil {
        panic(err)
    }

    GetFilter, err := p.Lookup("GetFilter")
    if err != nil {
        panic(err)
    }

    filter, err := GetFilter.(func() (filter.Filter, error))()
    fmt.Printf("GetFilter result: %T %v %v\n", filter, filter, err)
    fmt.Println("\tName:", filter.Name())
    fmt.Println("\tAge:", filter.Age())
}

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Meluluskan Antara Muka Tersuai ke Pemalam 1.8?. 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