GNU/Linux dağıtımlarında tail komutu’na aşina olabilirsiniz. Genellikle -f flag’i ile dosyayı follow edip yeni eklenen metin’leri görmek için kullanıyoruz. Anlık log görüntülemek için oldukça kullanıyoruz.
Golang öğrenirken böyle bir programı go ile basitçe yazmayı araştırmaya başladım. Araştırmalarım sonucunda bu ufak makaleyi hazırladım.
İlk olarak hiçbir işletim sistemi api’si kullanmadan bunu nasıl yaparız ona bakalım.Çok basitçe hepimizin bazen yaptığı kötü çözümü entegre edelim. Dosyayı okuyup son satırlarını yazdırırır.Sonrasında sleep komutunu çalıştırıp tekrar okuyabiliriz.
Bu program teknik olarak çalışıyor ancak izlediğimiz dosyada değişiklik olur olmaz yanıt vermiyor. Çünkü son satıra ulaşınca bir süre uyuyor ve tekrar aynı işlemi yapıyor.Ayrıyetten her seferinde dosyayı tekrar okuyup yazıyor.
Tail programramı tabiki bunu bu şekilde yapmıyor. Linux, dosya sistemi olaylarını izlemek için inotify adında bir API sağlar.Bu API’yi kullanarak dosyadaki değişimi event olarak yakalyıp işlememiz mümkün.
API’nin kendi dökümanındaki açıklamasına bakalım:
The inotify API provides a mechanism for monitoring filesystem events. Inotify can be used to monitor individual files, or to monitor directories. When a directory is monitored, inotify will return events for the directory itself, and for files inside the directory.
Açıklamadan’da anlayacağımız gibi aslında tam olarak ihtiyacımız olan şey. Dosyada değişiklik olduğunda bunu bize event olarak bildirmesini istiyoruz.
Golang’te syslog paketini kullanarak inotify api’yi kullanabiliriz.
Her programın bazı verileri ve bilgileri bellekte saklaması gerekir. Veriler, belirli bir bellek konumunda saklanırlar.
Değişken dediğimiz şeyler, verilerin saklandığı bir hafıza konumuna verilen uygun bir isimdir. Bir adın dışında her değişkenin de ilişkili bir türü vardır.
Değişken türleri(int,string) ilgili veri kümelerini kategorilere ayırır, ram bellek üzerinde saklanma biçimlerini, tutabilecekleri değer aralığını ve üzerlerinde yapılabilecek işlemleri tanımlamaktadırlar.
Kısa bir girişten sonra go da nasıl değişken tanımlarız incelemeye başlayalım.
Var anahtar sözcüğü ile değişken tanımlama
İlk inceleyeceğimiz tür var anahtar sözcüğü ile oluşturulan olucaktır.Burda dikkatini çeken şey tiplerin değişken isimlerinden sonra gelmesi olabilir.Çoğu programlama dilinden farklı olarak golang’te öncelikle değişken adı sonra türü gelmektedir.Aşağıdaki örneği inceleyelim.
var a int
var b bool
a = 15
b = false
Short-hand notation (:=) ile değişken tanımlama
a := 15
b := false
Bu şekilde bir tanımlama yaptığınız zaman sadece bir deklarasyon yapmakla kalmayıp aynı zamanda bir değer ataması yapmış oluyorsunuz; ancak bazı göz ardı etmememiz gereken hususlar var. Örneğin, yukarıdaki yöntemle aynı değişkeni iki kez tanımlayın aynı değeri atadığınız zaman Go Compiler size hata veriyor. Yine aynı şekilde short-hand notation ile değişkenleri fonksiyonların dışında tanımlayamıyorsunuz.
Go, Statik olarak yazılan bir dil olmasına rağmen, beyan ettiğiniz her değişkenin türünü açıkça belirtmenizi gerektirmez.
Başlangıç değeri olan bir değişkeni bildirdiğinizde, Golang otomatik olarak değişkenin türünü sağ taraftaki değerden alır. Bu nedenle, bildirim sırasında değişkeni başlatırken türü belirtmeniz gerekmez.
Çoklu değişken tanımlamaları
var (
x int
b bool
)
var (
firtname , lastname string
age int8
)
Ayrıca çoklu değişkeni tek satırdada tanımlayabilirsiniz.
a, b := 20, 16
Zero values
Golang’te tanımladığınız değiikene herhangir bir değer atamazsanız değişken türüne göre boş değer atanacaktır.Aşağıdaki tabloda tipine göre başlayacağı sıfır değerlerini görebilirsiniz.
Type
Zero values
bool
false
string
“”
int, int8, int16 vs.
0
float32, float64
0.0
Değişken Türleri
Go’da değişken tanımlamayı inceledikten sonrada şimdi değişken tiplerimi inceleyelim.
Boolean
Boolean tipi aslında hepimizin aşina olduğu içerisine mantıksal olarka true ve false tutan değişken tipidir.
Sayısal Tipler
Go, int,float gibi diğer programlama dillerinden iyi tanıdğımız değişken tipine sahiptir. Bu tür makineniz için uygun uzunluğa sahiptir, yani 32 bitlik bir makinede 32 bit ve 64 bitlik bir makinede 64 bittir.
Uzunluk hakkında açık olmak istiyorsanız, int32 veya uint32 ile de buna sahip olabilirsiniz. (İmzalı ve imzasız) tamsayıların tam listesi int8, int16, int32, int64 , uint8, uint16, uint32, uint64‘tür.
Ayrıca küsuratlı sayılar için kullanabileceğimiz float32 ve float64 türleride golang’te mevcuttur.
Örneğin kullanıcınızın yaşını tutacaksanız int8 ile daha kısa bi aralık belirleyip belleğinizi daha verimli kullanabilirsiniz.
Not: u ile başlayan veri tipleri bir çok dilden bildiğimiz üzere unsigned(sinyalsiz)’dir yani 0’dan küçük-eksi değer alamaz.
Strings Bir diğer önemli değişken türü ise gene hepimizin aşina olduğu stringlerdir.
s := "Hello World!"
Go’daki string, çift tırnak içine alınmış bir dizi UTF-8 karakteridir (”). Tek tırnak (’) kullanırsanız, bir karakter (UTF-8 ile kodlanmış) anlamına gelir; Bu, Go’da bir string değildir.Yeni başlayanların genellikle en çok hata yaptığı noktadır.O yüzden dikkat etmenizde fayda var.
Bir değişkene string atandıktan sonra içerisinden karakter değiştirilemez
C’den gelen insanlar için; Go’da aşağıdaki işlem hata verecektir.
var s string = "test"
s[0] = 'c' ← Birinci karaktei ’c’ ile değiştir. Fakat bu bir hatadır
Eğer böyle birşey yapma ihtiyacınız varsa aşağıdaki kod’u incelemenizi öneririm.
s := "test"
c := []rune(s)
c[0] = 'c'
s2 := string(c)
fmt.Printf("%s\n", s2)
Şimdi adım adım kod’ta ne yaptığımıza bir bakalım.
İlk Önce rune(Unicode kod noktalarını temsil ederler.) ile string’imizi rune array’ine dönüştürdük.
Daha sonra bu array’in ilk elemanını değiştirdik.(Tek tırnak kullanıldığına dikkat edin.)
Daha sonra rune tipinde değer tutan array’imizi tekrar string’e çevirip ekrana yazdırdık.
Runes
Rune, aslında int32 için bir alias’dır UTF-8 kod noktasıdır.
Rune değişmez değerleri yalnızca 32 bit tam sayı değerleridir (ancak türsüz sabitlerdir, bu nedenle türleri değişebilir). Unicode kod noktalarını temsil ederler. Örneğin, rune değişmez değeri ‘a’ aslında 97 sayısıdır.
fmt.Println([]rune("cafe")) // [99 97 102 233]
Rune tipi ile ilgili ileride daha detaylı yazı hazırlamayı düşünüyorum.Rune türü ile ilgili daha detaylı bilgi için aşağıdaki kaynaklara göz atabilirsiniz