Go'daki paketler, kodun organize edilmesi ve görünürlük alanlarının yönetimi için temel yapı taşıdır. Tarihsel olarak Go, programlamayı şeffaf hale getirmek ve C/C++ ve Java'daki bağımlılık çözümü belirsizliklerinden kaçınmak için basit bir ithalat ve klasör hiyerarisi modeli seçmiştir. Go'nun çözdüğü problem, anlaşılır bir proje yapısı oluşturmak, isim çakışmalarını önlemek ve modüllerin birbirinden bağımsız olmasını sağlamaktır.
Problem: Tek bir organizasyon yaklaşımı olmadan uygulamayı ölçeklendirmek mümkün değildir, tekrar eden işler, isim çakışmaları ve döngüsel bağımlılıklar ortaya çıkar. Nesnelerin görünürlük alanlarını açık bir şekilde takip etmek önemlidir.
Çözüm: Her klasör, bir paket dosyası içerir (package somepackage), klasör adı ile paket adı en iyi uygulama olarak aynı olmalıdır. İthalat, import anahtar kelimesiyle yapılır ve yalnızca büyük harfle başlayan nesneler dışa aktarılır. Bağımlılık yönetimi, go modülleri (go.mod) aracılığıyla yapılır.
Örnek yapı ve ithalat:
// internal/mathops/add.go package mathops func Add(a, b int) int { return a + b } // main.go package main import ( "fmt" "myservice/internal/mathops" ) func main() { fmt.Println(mathops.Add(2, 3)) }
Anahtar özellikler:
Bir klasörde birkaç farklı paket ilan edilebilir mi?
Hayır, klasördeki tüm dosyalar tek bir pakete ait olmalıdır.
Büyük harfle başlayan bir isme sahip olan fonksiyonlar dışa aktarılacak mı, eğer paket adı küçük harfleyse?
Evet, dışa aktarım yalnızca nesne adının (fonksiyon, tip, değişken) ilk harfine bağlıdır, paket adından bağımsızdır.
Farklı bir takma ad ile paket ithal edilebilir mi ve bu, fonksiyonların görünürlüğünü etkiler mi?
Evet, edilebilir. Takma ad, pakete hangi isimle erişileceğini etkiler, ancak görünürlük alanını değiştirmez:
import mymath "myservice/internal/mathops" mymath.Add(1,2)
Geliştirici, tüm fonksiyonları main paketinde tek bir "utils.go" dosyasına yerleştirir, iş mantığını ayrı paketlere ayırmaz.
Artılar:
Eksiler:
İş mantığı, yardımcı programlar, işleyiciler, veri modelleri bağımsız paketlere çıkarılmıştır: mathops, user, storage, api. İthalat belirli bir amaca göre yapılır, her paket ayrı ayrı test edilir.
Artılar:
Eksiler: