Go dilinde kod organizasyonu, paketler (packages) ve görünürlük sistemi modülerlik, yeniden kullanım ve mantığın kapsüllenmesi açısından önemli bir rol oynamaktadır.
Birçok klasik nesne yönelimli miras alan dilin aksine, Go başından beri basit modüller etrafında tasarlanmıştır — dışa aktarım ve ithalat için net kurallara sahip paketler. Bu, minimalizm, basitlik ve bağımlılıkların sıkı kontrolü felsefesinin bir mirasıdır.
Eğer bileşenlerin açık bir görünürlüğü yoksa, isimlerde karmaşa ortaya çıkar, dosyalar arasındaki bağımlılıkları takip etmek zorlaşır ve özel uygulama detaylarının yanlış kullanım riski artar. Dışa aktarım organizasyonundaki hatalar, düzeltmesi zor hatalara ve kapsüllemeyi ihlal etmeye yol açabilir.
Go'da her dosya mutlaka bir pakete ait olmalıdır (package isim). Go'daki tüm görünürlük şunlarla belirlenir:
Adı büyük harfle başlayan tüm fonksiyonlar, türler, değişkenler, sabitler ve yöntemler paket dışına aktarılır ve diğer paketlere ithal edildikten sonra erişilebilir. Diğerleri yalnızca paket içinde erişilebilir.
Yapı örneği:
project/
│
├── main.go // package main
└── mathutil/
└── mathutil.go // package mathutil
Kod örneği:
// mathutil/mathutil.go package mathutil // Public - dışa aktarılan fonksiyon func Sum(a, b int) int { return a + b } // private - dışa aktarılmayan fonksiyon func subtract(a, b int) int { return a - b }
// main.go package main import ( "fmt" "project/mathutil" ) func main() { fmt.Println(mathutil.Sum(2, 3)) // 5 // fmt.Println(mathutil.subtract(3,2)) // Derleme hatası! subtract dışa aktarılmamış }
Anahtar özellikler:
Küçük harfle tanımlanmış bir değişken ya da fonksiyonu diğer mekanizmalarla dışa aktarabilir miyiz?
Hayır. Go'da public, private gibi anahtar kelimeler yoktur, her şey yalnızca adın ilk harfi ile belirlenir (unicode kategorisi — büyük harf).
Bir paketin bir dosyasındaki fonksiyonlar, aynı paketin diğer dosyalarındaki özel fonksiyonları kullanabilir mi?
Evet, görünürlük paket düzeyinde sınırlıdır, dosya değil. Tüm özel elemanlar, bir paketin tüm dosyalarında kullanılabilir.
Kod örneği:
// mathutil/helpers.go package mathutil func hiddenHelper() int { return 42 } // mathutil/mathutil.go package mathutil func UseHelper() int { return hiddenHelper() // erişilebilir! }
Aynı pakette farklı dosyalar içinde aynı isimde bir fonksiyon veya tür oluşturmak mümkün mü?
Hayır, derleme hatası oluşacaktır — paket içinde isimler benzersiz olmalıdır, farklı dosyalarda tanımlansalar bile.
xxx_test.go dosyasını kullanmak daha iyidir)Büyük bir ekip, tüm yardımcı fonksiyonları ve türleri bir util paketine koyar ve her şeyi dışa aktarır:
Artılar:
Eksiler:
Ekip, kodu iş alanlarına göre dikkatlice modüllere ayırır ve yalnızca API'yi dışa aktarır:
Artılar:
Eksiler: