Eminim ki hepiniz bir şekilde bu dili duymuşsunuzdur. GoLang ( konunun geri kalanında go diye belirteceğim ) 2007 yılında Robert Griesemer, Rob Pike, and Ken Thompson liderliğinde Google tarafından gelişitirilmiş çok amaçlı bir yazılım dilidir.
Burada vurgulamak istediğim şey, dilin geliştirilme tarihi. 2007. Yani multi-core architecturelara çoktan geçtiğimiz dönemler. Goyu Go yapan şey, goroutine denen özel bir tür multi threading aracı. Neyse oraya da geleceğiz.
Öncelikle obligatory hello world'ümüzü paylaşalım:
Kod:
package main
import (
"fmt"
)
func main() {
fmt.Println("Hello World!")
}
Şimdi biraz daha detaya girelim.
Şahsi deneyimim olarak, Goyu REST servisleri yazarken kullanıyorum, ki şuan aktif olarak yürttüğüm bir pojenin tüm backendi denebilir. Neden Goyu tercih ettiğimi özetlemem gerekirse, benchmarklarda en optimal sonucu veren kütüphaneler Goya ait. [ Gerçi şuan bakıldığında C h20 ile yok ediyor ortalığı ama ] Saniyede 50.000 isteğe cevap verebilme kapasitesinden bahsediyoruz, overheade sebep olmadan.
Bunun haricinde, Gonun syntaxı C ile hemen hemen aynı, ki Rust gibi C uyumluluğuna da sahip. Hatta go c diye bir komutla c de yazılmış api callarına gidip gelmenizi kolaylaştırmış yazarlar. Tabi ki C dediğimizde, önümüze pointerlar geliyor. Goda da fazlaca kullanıyoruz bu pointerları. Zaten performansının büyük bir kısmını buradan alıyor. Örneğin
Kod:
myVar := *[]collector.BaseModel
Kod:
// Alışık olduğumuz
BaseModel bm [] ;
// Go versiyonu
bm := []BaseModel
Son olarakta channel ve goroutineler ile ilgili bir örnek vereyim:
Kod:
package main
import "fmt"
func f(from string) {
for i := 0; i < 3; i++ {
fmt.Println(from, ":", i)
}
}
func main() {
f("direct")
go f("goroutine")
}
Output, Direct 1-2-3 diye genişlerken, go ile yazılmış fonkisyonda, ouput goroutine 1-2-3 diye printlenecek buraya kadar tamamız. Ama, f(direct)i gorouitne den sonra çağırmış olsaydık
goroutine1, direct1-2 gouroutine2 direct3 gibi bir output alacaktık.
Go rutini verilen fonskiyonu alıp izole eder, daha sonra kendisine ait bir threadde çalıştırır. Threat içerisinde sonucu aldıkta channel yardımıyla tekrar çağrıldığı yere döner.
Özetle, Tobias Lütke'nin de dediği gibi, Go geleceğin server dilidir. Nerde ne zaman kullanayım sorusu ise, eğer hedefiniz aynı anda birden fazla isteği, birden fazla kullanıcı için handle etmekse, performansı önemsiyorsanız (aksini iddia ediyorsanız bu işi zaten bırakın, performansı önemsemeyen şirket/geliştirici yanlış alandadır) ve derlenen bir dil ile uğraşmak istiyorsanız Go sizlik. İstediğiniz gibi kullanabilirsiniz.
Tabii ki performans açısından en iyi demiyorum. Şu aralar benchmark bazında C herkese toz yutturuyor yukarıda da belirttiğim ve beklenen üzere. Ama Rust'ında ondan pek aşağı kalır yanı yok. Burada yapacağınız trade off, sizin için neyin daha önemli olduğudur.
Not: Konuya resim, copy paste metinler & kodlar eklemiyorum, ilginizi çektiyse, dil, küçük bir google araştırması yapın. Amacım sadece dili tanıtmak.
Moderatör tarafında düzenlendi: