Perkongsian Jenis Data Tersuai dalam Pemalam Go
Dalam Go, anda boleh menentukan jenis data tersuai dalam pemalam. Walau bagaimanapun, berkongsi jenis data ini antara pemalam dan aplikasi utama memerlukan pertimbangan yang teliti.
Had Pencarian Simbol
Apabila mengakses simbol yang dieksport daripada pemalam, anda boleh taip menegaskannya ke dalam antara muka. Walau bagaimanapun, taip terus untuk menegaskannya ke dalam struct tidak boleh menggunakan carian simbol sahaja.
Jenis Data Tersuai sebagai Contoh
Mari kita pertimbangkan contoh berikut:
<code class="go">// plugin.go package main type Person struct { Name string } var P Person = Person{ Name: "Emma", }</code>
<code class="go">// app.go package main import ( "fmt" "os" "plugin" ) 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) // Panic: "Wrong symbol type" }</code>
Dalam contoh ini, simbol P ialah struct Orang. Walau bagaimanapun, penegasan jenis dalam apl utama gagal dengan ralat.
Penyelesaian: Definisi Jenis Asing
Kunci untuk berkongsi jenis data tersuai antara pemalam dan aplikasi utama adalah untuk menentukan jenis secara berasingan. Dengan cara ini, kedua-dua pemalam dan apl utama boleh merujuk kepada definisi jenis yang sama.
Contoh dengan Definisi Jenis Asing
<code class="go">// type.go package filter type Filter struct { Name string Age int }</code>
<code class="go">// plugin.go package main import "play/filter" var MyFilter filter.Filter = filter.Filter{ Name: "Bob", Age: 21, } func CreateFilter() filter.Filter { return filter.Filter{ Name: "Bob", Age: 21, } }</code>
<code class="go">// app.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) // Output: &{Name:Bob Age:21} }</code>
Dengan mentakrifkan jenis Penapis dalam pakej yang berasingan, pemalam dan apl utama boleh mengimport dan menggunakannya untuk penegasan jenis.
Atas ialah kandungan terperinci Bagaimana untuk Berkongsi Jenis Data Tersuai Antara Pemalam Go dan Aplikasi Utama?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!