Pemuatan Dinamis dan Simbol
Memuat plugin saat runtime dan memanggil simbol yang diekspor
Pemuatan Dinamis dan Simbol adalah pelajaran Go Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Go Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Go Academy mencakup 4 pelajaran total.
plugin.Open
plugin.Open(path) memuat berkas .so yang telah dikompilasi. Fungsi ini menginisialisasi fungsi init() dan variabel tingkat paket milik pengaya, lalu menyediakan simbol-simbol tersebut.
p, err := plugin.Open("./plugins/mymodule.so")
if err != nil { log.Fatalf("load: %v", err) }p.Lookup
p.Lookup(name) menemukan simbol yang diekspor berdasarkan nama. Fungsi ini mengembalikan tipe apa pun; lakukan pemeriksaan tipe ke tipe yang diharapkan.
sym, err := p.Lookup("NewProcessor")
if err != nil { log.Fatalf("lookup: %v", err) }
fn, ok := sym.(func() Processor)
if !ok { log.Fatal("wrong type") }Memuat beberapa pengaya
Muat setiap berkas .so dari sebuah direktori dan daftarkan dalam sebuah perulangan:
entries, _ := os.ReadDir("./plugins")
for _, e := range entries {
if !strings.HasSuffix(e.Name(), ".so") { continue }
p, err := plugin.Open("./plugins/" + e.Name())
if err != nil { log.Printf("skip %s: %v", e.Name(), err); continue }
loadPlugin(p)
}Pola fungsi pabrik
Pengaya mengekspor fungsi pabrik (NewXxx() Processor), bukan nilai, sehingga program utama memperoleh instans baru pada setiap pemanggilan:
sym, _ := p.Lookup("NewProcessor")
factory := sym.(func() Processor)
proc := factory() // new instancePenanganan kesalahan saat pencarian
Kesalahan pencarian berarti simbol tidak diekspor atau namanya salah. Tangani dengan baik — lewati pengaya tersebut atau catat kesalahannya, lalu lanjutkan memuat pengaya lainnya.
plugin.Open bersifat idempoten
Memanggil plugin.Open dua kali pada jalur yang sama mengembalikan pengaya yang sama. Pengaya hanya diinisialisasi sekali.
Pemuatan sesuai kebutuhan
Muat pengaya saat diperlukan (ketika pertama kali digunakan), bukan saat program dimulai, untuk mengurangi waktu mulai. Gunakan sync.Once untuk setiap pengaya agar pengaya tersebut dimuat tepat satu kali.
var mu sync.Mutex
var loaded = map[string]*plugin.Plugin{}
func getPlugin(path string) (*plugin.Plugin, error) {
mu.Lock(); defer mu.Unlock()
if p, ok := loaded[path]; ok { return p, nil }
p, err := plugin.Open(path)
if err != nil { return nil, err }
loaded[path] = p
return p, nil
}Konvensi penamaan simbol
Gunakan nama CamelCase yang diawali huruf kapital untuk simbol yang diekspor (aturan visibilitas Go berlaku). Konvensi umum: Plugin untuk nilai utama atau New untuk pabrik.
Menangani kepanikan pengaya
Jika pengaya memicu kepanikan, middleware pemulihan di program utama mungkin dapat menangkapnya, tetapi goroutine milik pengaya mungkin berada dalam keadaan yang tidak terdefinisi. Catat kesalahannya dan lewati pengaya tersebut; jangan coba lagi.
Memvalidasi metadata pengaya
Setelah memuat, periksa simbol metadata (misalnya, PluginVersion string) untuk memvalidasi kompatibilitas sebelum mendaftarkannya:
ver, _ := p.Lookup("PluginVersion")
if *ver.(*string) != expectedVersion { log.Fatal("incompatible") }Pemeriksaan Singkat
Apa yang terjadi jika Anda memanggil plugin.Open dua kali dengan jalur yang sama?
Rangkuman: Pemuatan Dinamis dan Simbol
Poin utama:
- plugin.Open memuat .so; p.Lookup mengembalikan tipe apa pun → lakukan pemeriksaan tipe
- Muat pengaya dari sebuah direktori dalam perulangan untuk membangun sistem pengaya
- plugin.Open bersifat idempoten; init() berjalan sekali untuk setiap jalur
- Utamakan fungsi pabrik daripada simbol nilai untuk memperoleh instans baru
Belajar Go dengan tutor AI — gratis
Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.
- Kursus
- 51
- Pelajaran
- 203
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Pemuatan Dinamis dan Simbol” gratis?
Ya — teks lengkap “Pemuatan Dinamis dan Simbol” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Go Academy, upgrade ke CoddyKit PRO. Kursus Go Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Pemuatan Dinamis dan Simbol”?
Memuat plugin saat runtime dan memanggil simbol yang diekspor Kamu berlatih Go Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Go Academy?
Tidak diperlukan pengalaman sebelumnya. Go Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Pemuatan Dinamis dan Simbol” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Go Academy ini?
Ya. Setiap pelajaran Go Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Dasar-Dasar Paket Plugin Go
- Mendesain Interface Plugin
- Pemuatan Dinamis dan Simbol
- Alternatif: HashiCorp go-plugin