Go Academy · Pelajaran

Pemuatan Dinamis dan Simbol

Memuat plugin saat runtime dan memanggil simbol yang diekspor

Pelajaran 3 dari 412 langkah

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 instance

Penanganan 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
Gratis untuk memulai

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

  1. Dasar-Dasar Paket Plugin Go
  2. Mendesain Interface Plugin
  3. Pemuatan Dinamis dan Simbol
  4. Alternatif: HashiCorp go-plugin
← Kembali ke Go Academy