Özet - plugin
- Go kursu
- İleri seviye
- Ders 24/68
- 4 dk
Plugin yapısını birleştirerek bir eklenti sistemi yazarsın.
plugin özeti
Akış: plugin'i -buildmode=plugin ile derle → plugin.Open ile yükle → Lookup ile sembolü al → fonksiyona ya da işaretçiye güvenli tür iddiası yap → kullan. Her adımda hata kontrol edilir.
Sınırlar: Windows yok, aynı Go ve bağımlılık sürümü şart, kaldırma yok. Bu sınırlar yüzünden ayrı süreç tabanlı eklenti sistemleri sık tercih edilir.
Komut kaydı örneği
Bir CLI aracı, plugins/ klasöründeki her .so dosyasını açıp Komut sembolünü arayabilir ve bulduklarını bir map'e kaydedebilir:
komutlar := map[string]Komut{}
for _, yol := range dosyalar {
p, err := plugin.Open(yol)
if err != nil { continue }
if s, err := p.Lookup("Komut"); err == nil {
if k, ok := s.(Komut); ok { komutlar[k.Ad()] = k }
}
}Uygulama Komut kaydı
type Komut interface { Ad() string } ve type selam struct{} tanımla; selam için Ad() "selam" döndürsün. Plugin sembolünü taklit eden var sym any = selam{} değerini , ok iddiasıyla Komut'a çevir, bir map[string]Komut'a ekle ve map'in uzunluğunu yazdır.
Başlangıç kodu
package main
import "fmt"
func main() {
// buraya yaz
}Örnek çözüm
package main
import "fmt"
type Komut interface{ Ad() string }
type selam struct{}
func (selam) Ad() string { return "selam" }
func main() {
komutlar := map[string]Komut{}
var sym any = selam{}
if k, ok := sym.(Komut); ok {
komutlar[k.Ad()] = k
}
fmt.Println(len(komutlar))
}Beklenen çıktı
1
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Hangisi plugin yerine sık kullanılan bir alternatiftir?
- sync.Pool
- Ayrı süreçle gRPC/RPC üzerinden konuşmak Doğru cevap
- unsafe.Pointer
- go:embed
Açıklama: HashiCorp go-plugin gibi sistemler eklentiyi ayrı süreçte çalıştırır; sürüm bağımlılığı ve platform sınırı kalkar.
2 Derleme modu
go build -buildmode=____ -o ek.so ./ek
go build -buildmode=plugin -o ek.so ./ek
Açıklama: plugin derleme modu Go'dan yüklenebilir .so üretir.
3 Akış
| Kavram | Anlamı |
|---|---|
-buildmode=plugin |
Derleme |
plugin.Open |
Yükleme |
Lookup |
Sembol |
s.(Komut) |
Tür iddiası |