Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Meluluskan Antara Muka Tersuai ke Pemalam 1.8?
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!