Go dili ne kadar popüler? Google, AWS, Cloudflare, CoreOS gibi yabancı ülkeler ve Qiniu, Alibaba gibi yerli şirketler, bulut bilişimle ilgili ürünlerini büyük ölçekte geliştirmek için Go dilini kullanmaya başladı. Go dilini kullanırken hangi Evet ve Ama Noktalarına dikkat etmeliyim? Yakın zamanda, Google tarafından 2009'da başlatılan açık kaynaklı bir program dili olan Go dilini kullanarak bir API yazdık. Go'yu geliştirme için kullanma sürecinde çok fazla deneyim ve deneyim kazandık ve bunu okuyucularla paylaşmak istiyoruz, bu yüzden bu makaleyi elimizde bulundurduk.
Bir proje için programlama dili seçerken, hangi programlama dilinin üzerine inşa edileceğini düşünmeden önce projenin neye inşa edileceğini her zaman anlamanızı öneririz. Ürünün nasıl inşa edileceği konusunda belirleyici faktör olmasına izin verin.
İşte Go ile geliştirirken bulduğumuz bazı artılar ve eksiler, bir sonraki projeniz için uygun olup olmadığını anlamanıza yardımcı olur.
Go'da sevdiğimiz şey
Go dilinin kullanımı son yıllarda patlama gösterdi. Görünüşe göre her startup arka uç sistemleri için kullanıyor. Geliştiricilerin bu kadar popüler bulmasının birçok nedeni var.
Go dili çok hızlı
Go çok hızlı bir programlama dilidir. Go makine koduna derlendiği için, yorumlayıcı veya sanal çalışma süresine sahip programlama dillerinden doğal olarak daha iyi performans gösterir. Go programları ayrıca çok hızlı derlenir ve çok küçük ikili kartlar üretir. API'miz sadece birkaç saniyede derleniyor ve 11.5MB kadar küçük bir çalıştırılabilir dosya ortaya çıkıyor.
Ustalaşması kolay
Go dilinin sözdizimi diğer dillere kıyasla basit ve anlaşılması kolaydır. Go sözdiziminin çoğunu kafanızda ezberleyebilirsiniz, bu da bir şeyler aramak için çok zaman harcamamanız anlamına gelir. Go dili de çok temiz ve okunması kolay. Go olmayan programcılar, özellikle C-tarzı sözdizimine alışkın olanlar, Go program kodunu okuyup neler olduğunu anlayabilirler.
Statik tip tanım dili
Go güçlü bir statik tip tanımlayıcı dildir. Int, byte ve string gibi temel türler vardır. Ayrıca yapı türleri de vardır. Güçlü tipli herhangi bir dilde olduğu gibi, tür sistemi derleyicinin tüm sınıf için hataları yakalamasına yardımcı olmasına olanak tanır. Go dili ayrıca yerleşik liste ve eşleme türlerine sahip ve kullanımı da kolay.
Arayüz tipi
Go dilinin arayüz türleri vardır ve herhangi bir yapı, arayüzü uygulayarak bir arayüzü kolayca karşılayabilir. Bu, kodunuzdaki bağımlılıkları ayırmanızı sağlar. Sonra bağımlılıklarınızı testlerinizde simüle edebilirsiniz. Arayüzler kullanarak daha modüler, test edilebilir kod yazabilirsiniz. Go dili ayrıca birinci sınıf işlevlere sahiptir, bu da geliştiricilerin daha pratik bir şekilde kod yazmasını mümkün kılar.
Standart kütüphane
Go dilinin oldukça iyi bir standart kütüphanesi var. Temel tipleri işlemek için pratik yerleşik işlevler sağlar. Bazı paketler web sunucusu oluşturmak, I/O işlemeyi, şifreleme kullanmayı ve ham baytları işlemeyi kolaylaştırıyor. Standart kütüphane tarafından sağlanan JSON serileştirme ve serilikten çıkarma çok basittir. "Tags" kullanarak, struct alanının yanında JSON alan adını belirtebilirsiniz.
Test desteği
Test desteği standart kütüphanede entegre edilmiştir ve ek bağımlılık gerektirmez. Eğer thing.go adında bir dosyanız varsa, testleri thing_test.go adlı başka bir dosyaya yazın ve "go test" çalıştırın. Go bu testleri hızlıca yapacak.
Statik analiz araçları
Go dili için statik analiz araçları çok sayıda ve güçlüdür. Özel bir araç gofmt'tir; bu araç Go'nun önerdiği tarza göre kod biçimlendirir. Bu, projenin birçok görüşünü normalleştirebilir ve ekip ödül yöneticisinin kodun yaptığı işe odaklanmasını sağlar. Her yapıda gofmt, golint ve vet çalıştırıyoruz ve herhangi bir uyarı bulursak sürüm başarısız oluyor.
Çöp toplama
Go dili tasarlanırken, bellek yönetimi C ve C++'dan daha kolay olacak şekilde kasıtlı olarak tasarlandı. Dinamik tahsisin nesnesi çöp toplamadır. Go dili, işaretçi işlemlerine izin vermediği için işaretçi kullanımını daha güvenli kılar. Değer türlerini kullanma seçeneği de sunulmaktadır.
Daha kolay eşzamanlı model
Eşzamanlı programlama asla kolay olmasa da, Go'yu eşzamanlı programlamak diğer dillere göre daha kolaydır. "Goroutine" adı verilen hafif bir iş parçacığı oluşturmak ve onunla "channel" üzerinden iletişim kurmak neredeyse basit bir iştir, ancak daha karmaşık modeller için de mümkündür.
Go'da sevmediğimiz şeyler
Daha önce tartıştığımız gibi, Go gerçekten mükemmel bir dil. Temiz bir sözdizimine sahip ve hızlı uygulanabiliyor. Ayrıca birçok avantajı vardır. Ama bir programlama dilinin tamamı sadece sözdizimine atıfta bulunmaz. İşte karşılaştığımız bazı sorunlar.
Jenerik yok
Öncelikle, bu sorun, odadaki bir fil gibi, açık ve göz ardı edilen bir gerçektir. Go dilinde jenerik yoktur. Java gibi dillerden geliştiriciler için Go'ya geçmek aşılması gereken büyük bir engel. Bu, kodun yeniden kullanım seviyesinin azaldığı anlamına gelir. Go dili birinci sınıf fonksiyonlara sahip olsa da, "map", "reduce" ve "filter" gibi fonksiyonlar tek bir koleksiyon türünde çalışacak şekilde yazılırsa, bu fonksiyonları diğer farklı koleksiyon türleri için tekrar kullanamazsınız. Bu sorunu çözmenin birçok yolu var, ancak hepsi daha fazla kod yazmaya karar veriyor, bu da verimliliği ve sürdürülebilirliği azaltıyor.
Arayüz örtük
Arayüzlere sahip olmak güzel olsa da, yapı arayüzleri açıkça değil, örtük olarak uygular. Bu Go dilinin güçlü yönlerinden biri olarak söylenir, ancak arayüzleri yapıdan anlayıp uygulamadığını anlamakta zorlandık. Programı derlemeye çalışarak gerçekten anlayabilirsiniz. Program küçükse, bunda kesinlikle bir sakınca yok. Ama bu program orta veya büyük ölçekli ise, sorun büyüktür.
Kütüphane desteği zayıf
Go kütüphane desteği eşitsiz. API'miz Contentful ile entegre oluyor, ancak sonuncusu resmi olarak desteklenen Go SDK'sına sahip değil. Bu da yazmamız (ve sürdürmemiz!) Contentful'da veri istemek ve ayrıştırmak için çok fazla kod var. Ayrıca üçüncü taraf Elasticsearch kütüphanelerine güvenmek zorundayız. Satıcılar tarafından sağlanan Go SDK'lar, Java, Ruby veya JavaScript muadilleri kadar popüler değildir.
Topluluk iletişimi zor
Go topluluğu önerileri kabul etmeyebilir. Bunu golint'in GitHub deposunda göz önünde bulundurun:Bağlantı girişi görünür., bir kullanıcı, Golint bir uyarı bulduğunda derlemede başarısız olabilmesini istedi (projede biz de bunu yapıyoruz). Savunucular bu fikri hemen reddetti. Ancak, çok fazla kişi bu konuya yorum yaptığı için, bir yıl sonra bakım sağlayıcılar nihayet istenen özellikleri eklemek zorunda kaldı.
Go topluluğu da web framework'ları sevmiyor gibi görünüyor. Go dilinin HTTP kütüphanesi birçok yönü kapsa, yol parametrelerini, girdi kontrolünü ve doğrulamayı desteklemez ve web uygulamalarında yaygın olan kesişen konuları desteklemez. Ruby geliştiricileri Rails'a, Java geliştiricilerinde Spring MVC, Python geliştiricilerinde Django var. Ancak birçok Go geliştiricisi çerçeve kullanmaktan kaçınmayı tercih ediyor. Ancak gerçek şu ki, çerçeveler yok, tam tersine, çok fazla çerçeve var. Ama bir proje için bir çerçeve kullanmaya başladığınızda, terk edilme kaderinden kaçınmak neredeyse imkansızdır.
Parçalı bağımlılık yönetimi
Uzun süre boyunca Go dilinde istikrarlı, resmi bir paket yöneticisi yoktu. Yıllarca topluluk yalvarışından sonra, Go projesi godep'i ancak yakın zamanda yayınladı. Bundan önce, bu boşluğu doldurmak için zaten birçok araç vardı. Projemizde çok güçlü bir Govendor kullanıyoruz, ancak bu topluluğun bölünmüş olduğu anlamına geliyor ve bu da Go diline yeni başlayan geliştiriciler için oldukça kafa karıştırıcı olabilir. Ayrıca, neredeyse tüm paket yöneticileri Git depoları tarafından desteklenir ve Git depolarının geçmişi her zaman değişebilir. Bunu Maven Central ile karşılaştırın; o da projenizin asılı olduğu kütüphaneleri asla silmez veya değiştirmez.
Go kullanıp kullanmamaya karar ver
Bazen, makineyi düşünmek gerekir. Bayt gönderip aldığınızda. Binlerce eşzamanlı süreci yönettiğinizde. Ayrıca bir işletim sistemi, konteyner sistemi veya blokzincir düğümü yazıyor olabilirsiniz. Bu durumlarda, büyük ihtimalle jenerik ilaçları umursamayacaksın. Çünkü çipten nanosaniyede performans sıkıştırmakla meşgul oluyorsunuz.
Ancak çoğu zaman insanları düşünmek gerekir. Çalışmanız gereken iş alanı verileri: müşteriler, çalışanlar, ürünler, siparişler. Bu alan varlıkları üzerinde çalışan iş mantığını yazmanız gerekir ve bu iş mantığını yıllarca sürdürmelisiniz. Ve değişen ihtiyaçlarla başa çıkmalı, ne kadar hızlı olursa o kadar iyi. Bu durumlarda, geliştiricinin deneyimi önemlidir.
Go, makine zamanına insan zamanından daha fazla değer veren bir programlama dilidir. Bazen, sizin alanınızda makine veya program performansı en kritik olanıdır. Bu durumlarda Go iyi bir C veya C++ alternatifi olabilir. Ancak tipik bir n-seviye uygulama yazarken, veritabanında performans darboğazları ve daha da önemlisi veriyi nasıl modelleyeceğiniz konusunda genellikle ortaya çıkar.
Go dilini kullanıp kullanmayacağımıza karar verirken aşağıdaki temel kuralları göz önünde bulundurun:
- Baytlarla uğraşıyorsanız, Go dili iyi bir tercih olabilir.
- Veri ile uğraşıyorsanız, Go dili iyi bir tercih olmayabilir.
Bu durum gelecekte bir gün değişebilir. Go dili ve topluluğu hâlâ genç. Jenerik ekleriyle bizi şaşırtabilirler; Ya da popüler bir web framework'ü büyük kazanç kazanır. Ancak şimdilik, evrensel destek, olgun bağımlılık yönetimi ve iş alanı modellemesine odaklanan olgun programlama dilleriyle devam edeceğiz.
|