Go ile web sunucusu yazmak, mutfağa girip “Ben bugün internet pişireceğim” demek gibidir: az malzemeyle şaşırtıcı derecede doyurucu sonuç alırsın. Go’nun standart kütüphanesindeki net/http paketi, harici framework kurmadan HTTP isteklerini dinleyen, yönlendiren ve yanıtlayan sade ama güçlü bir sunucu ayağa kaldırmamızı sağlar.
Devamı...
Modern yazılımlar artık tek başına yaşayan küçük adacıklar değil; API’ler, mikroservisler, mobil uygulamalar ve üçüncü parti sistemlerle sürekli konuşan sosyal kelebekler. Go tarafında bu sohbetin en popüler dili JSON’dır. Bir Go yapısını JSON’a çevirmek, valize kıyafet yerleştirmeye benzer: veriyi dış dünyaya taşınabilir, okunabilir ve standart bir forma sokarız. Gelen JSON’u tekrar Go struct’ına çözmek ise valizi açıp eşyaları doğru çekmecelere yerleştirmektir.
Devamı...
Bir programın dış dünyayla konuşmasının en eski ama en vazgeçilmez yolu dosyalardır. Günlük tutan bir uygulama, JSON ayarı okuyan bir oyun, CSV raporu üreten bir analiz aracı ya da büyük veri parçasını satır satır işleyen bir servis… Hepsi aslında aynı soruyu sorar: Veriyi güvenli, hızlı ve anlaşılır biçimde nasıl okur/yazarım?
Devamı...
Kod yazmak bazen Lego yapmak gibidir: Parçalar tek tek güzel görünür ama kuleyi kaldırınca ortadan ikiye ayrılıyorsa bir yerde hata vardır. Birim testleri, bu Lego parçalarının tek başına sağlam olup olmadığını kontrol eder. Profil analizi ise aynı parçaların ne kadar hızlı, ne kadar bellekle ve hangi maliyetle çalıştığını gösterir. Yani biri doğruluk dedektifi, diğeri performans dedektifidir.
Devamı...
Programlamada bazen bir şeyi nesne gibi davranışlarıyla değil, taşıdığı verilerle düşünmek daha doğrudur. İşte yapılar, yani structs, tam bu noktada sahneye çıkar. Bir koordinat, renk, sağlık değeri, tarih aralığı veya fiziksel hız vektörü düşünün: Bunlar genellikle küçük, anlamlı ve birlikte taşınması gereken veri paketleridir. Struct, farklı tiplerdeki alanları mantıksal bir bütün halinde gruplar ve özellikle veri odaklı tasarımda gereksiz soyutlama sisini dağıtarak işlemciye daha dost bir programlama modeli sunar.
Devamı...
Bir programın gerçek dünyayla ilk teması genellikle bir hatadır: dosya yoktur, ağ isteği zaman aşımına uğrar, kullanıcı sayı yerine “patates” yazar. Bazı diller bu anlarda istisna fırlatıp akışı dramatik biçimde keserken, Go gibi yaklaşımlar hatayı sıradan bir değer olarak masaya koyar. Yani hata, programın çökmesine çalışan bir canavar değil; kontrol edilmesi gereken bir dönüş değeridir.
Devamı...
Bir veri koleksiyonunu düşün: Elinde bir öğrenci listesi var ama öğrencileri 0, 1, 2 gibi indekslerle değil, okul numarası, e-posta adresi veya kullanıcı adı gibi anlamlı anahtarlarla bulmak istiyorsun. İşte haritalar, yani Maps, tam bu noktada sahneye çıkar. Map yapısı, veriyi anahtar-değer çifti olarak saklar ve arama, ekleme, silme gibi işlemleri oldukça okunabilir hale getirir.
Devamı...
Go’da bir struct yalnızca veri taşımak zorunda değildir; ona metotlar bağlayarak belirli davranışlar kazandırabiliriz. Bu yaklaşım, klasik sınıf tabanlı nesne yönelimli programlamadan farklıdır: Go’da class, kalıtım veya this yoktur; bunun yerine sade, açık ve güçlü bir receiver mantığı vardır.
Devamı...
Go dünyasında goroutine’ler sahneye çıktığında ortalık bir anda kalabalıklaşır: aynı anda çalışan fonksiyonlar, paralel iş akışları ve bolca hız! Fakat hızın yanında klasik bir soru gelir: Bu çalışan parçalar birbirleriyle nasıl güvenli konuşacak? Go’nun cevabı nettir: Belleği paylaşarak iletişim kurma; iletişim kurarak belleği paylaş.
Devamı...
Bilgisayarlarımız artık tek bir hızlı çekirdekten ibaret değil; çoğu makinede birden fazla çekirdek sessizce iş bekliyor. Go dilinin goroutine yaklaşımı tam da burada devreye girer: işletim sistemi iş parçacıklarına göre çok daha hafif görevler başlatarak aynı anda birçok işi düzenli, okunabilir ve verimli biçimde yürütmemizi sağlar.
Devamı...
Bir veri koleksiyonunu saklamak istediğimizde aklımıza ilk gelen yapı genellikle dizidir; ama Go gibi dillerde sahneye bir de dilimler, yani slices çıkar. Dizi, bellekte yan yana duran sabit sayıda kutu gibidir; dilim ise bu kutuların tamamını ya da bir bölümünü gösteren akıllı bir pencere. Aralarındaki farkı anlamak, sadece sözdizimini değil, performans ve bellek davranışını da doğru okumayı sağlar.
Devamı...
Yazılım dünyasında bazen nesnelere fazla kimlik sorarız: “Sen gerçekten User mısın, Admin misin, Robot musun?” Oysa esnek tasarımın daha havalı sorusu şudur: “Ne yapabiliyorsun?” Arayüzler, tam da bu bakış açısını kodun merkezine koyar. Bir nesnenin sınıf soy ağacına değil, sunduğu davranış sözleşmesine odaklanır. Böylece kodumuz daha az dedikoducu, daha çok iş bitirici olur.
Devamı...
Kural tabanlı botlar, yapay zekanın sihirli değneği gibi görünmeyebilir; ama gerçek dünyada birçok otomasyonun sessiz kahramanıdır. Bir metni okuyup sınıflandıran müşteri destek botu, başvuru formundaki riskleri işaretleyen karar destek sistemi veya moderasyon kuyruğuna mesaj düşüren filtreler çoğu zaman öğrenilmiş devasa modellerden önce mantık, koşul ve iyi tasarlanmış kurallar üzerine kurulur.
Devamı...
Programlama dünyasında işaretçiler, belleğin haritasını elinize alıp “şu adrese git, oradaki değeri getir” demenin yoludur. C ve C++ tarafında bu harita bazen hazineye, bazen de mayın tarlasına çıkar; Go ise aynı fikri daha güvenli korkuluklarla sunar. Yani adresleri görebiliriz, değerleri dolaylı yoldan değiştirebiliriz ama rastgele bellek aritmetiğiyle sistemi yakmamıza izin verilmez.
Devamı...
Bir programı ilginç yapan şey yalnızca komutları sırayla çalıştırması değil, koşullara göre karar verebilmesi ve gerektiğinde aynı işi tekrar tekrar yapabilmesidir. Go dilinde bu akış yönetiminin iki ana kahramanı vardır: karar almak için if-else, tekrar etmek için ise neredeyse her role bürünen for döngüsü.
Devamı...
Go, yani Gopher’ların neşeli dünyası, ilk bakışta C ailesinden gelmiş gibi görünür: süslü parantezler, tipler, fonksiyonlar… Fakat birkaç satır yazınca anlarız ki Go’nun derdi yalnızca kod çalıştırmak değil, geliştiriciyi karmaşadan korumaktır. C/C++ bize büyük güç ve büyük sorumluluk verirken, Go daha çok “ekipçe okunabilir, hızlı derlenebilir, güvenli varsayılanlara sahip yazılım” fikrini merkeze alır.
Devamı...
Go öğrenmeye başlamak, yeni bir müzik aleti almak gibidir: önce akort edersin, sonra şarkı çalmaya başlarsın. Bu yazıda Go derleyicisini kurup VS Code üzerinde sade, hızlı ve teoriyi pratiğe çevirmeye uygun bir geliştirme ortamı hazırlayacağız. Amacımız “her şeyi kurdum ama neden çalışmıyor?” paniğini azaltmak ve ilk Go programını güvenle koşturmak.
Devamı...
Kod yazarken aynı işlemi tekrar tekrar kopyalamak, mutfakta her çay demleyişte ocağı yeniden icat etmeye benzer. Fonksiyonlar tam da bu noktada devreye girer: Bir işi isimlendirir, sınırlarını çizer ve gerektiğinde çağırmamızı sağlar. Daha da güzeli, bazı dillerde bir fonksiyon tek seferde birden fazla sonuç döndürebilir; örneğin hem işlem sonucunu hem de durum bilgisini aynı anda almak mümkündür.
Devamı...
Programlamada değişkenler, veriyi sakladığımız küçük kutular gibi anlatılır; ama işin arka tarafında derleyicinin yürüttüğü ciddi bir kimlik kontrolü vardır. Bir değerin sayı mı, metin mi, mantıksal sonuç mu olduğunu bilmek; hataları erken yakalamak, belleği doğru kullanmak ve kodun niyetini açık göstermek için kritiktir.
Devamı...
Linux üzerinde gitar pedalı gibi çalışan bir ses efekti sistemi kurmak kulağa stüdyo büyüsü gibi gelebilir; ama ALSA’nın loopback cihazı ve biraz DSP bilgisiyle mikrofon girişini yakalayıp yankı ve pitch değişimi uygulayan gerçek zamanlı bir pedal yapmak gayet mümkün. Bu yazıda hedefimiz: mikrofonu sanal bir ses hattına bağlamak, sesi küçük tamponlar halinde işlemek ve çıktıyı hoparlöre ya da başka bir uygulamaya göndermek.
Devamı...