Go Programlama

Go Programlama Dili Dersleri

Go Dili Dersleri

  • Go Dili Giriş
    • Go Nedir?
    • Go nasıl indirilir ve kurulur
  • İlk Go Programı
    • Go Programı nasıl çalışır
  • Veri Tipleri
    • Tam Sayılar
    • Ondalıklı Sayılar
    • String Tipler
    • Boolean Tipler
  • Değişkenler
    • Değişken Tanımlama
    • Çoklu Değişken Tanımlama
    • Kapsam
    • Değişken Tanımlama Örnekleri
  • Sabitler
  • Kontrol Yapılar
    • for döngüsü
    • if else karar yapısı
    • switch case yapısı
  • Diziler, Dilimler ve Haritalar
    • Array
    • Slice
    • Map
  • Fonksiyonlar
    • Fonksyion tanımlama
    • Birden falza değer döndürme
    • Argüman kullanımı
    • Anonim fonksiyonlar
    • Recursive fonksiyonlar
    • Deger, panic ve recover
  • Pointers(İşaretçiler)
    • * ve & operatörü
    • new operatörü
  • Struct ve Interface kullanımı

 


Go Diline Giriş

Go Nedir?

Go (Golang olarak da bilinir), Google tarafından geliştirilen açık kaynaklı bir programlama dilidir. Statik olarak yazılmış ve derlenmiş dildir. Go eşzamanlı programlamayı destekler, yani aynı anda birden fazla işlemi çalıştırmaya izin verir. Bu, kanallar, goroutinler vb. Kullanılarak elde edilir. Go, hafıza yönetimini yapan ve işlevlerin ertelenmiş yürütülmesine izin veren çöp toplama sistemine sahiptir.

GO nasıl indirilir ve kurulur

Adım 1) https://golang.org/dl/ adresine gidin. İşletim sisteminiz için gerekli dosyayı indirin.

 

Adım 2) Next’e tıklayın.

Adım 3) Kurulum sözleşmesini onaylayıp Next’e tıklayın.

Adım 4) Kurulum klasörünü seçin ve Next’e tıklayın.

Adım 5) Go kuruluma hazır. Install’a tıklayın.

Adım 5) Kurulum tamamlandıktan sonra Finish’e tıklayın.

Adım 6) Kurulum tamamlandıktan sonra, terminali açıp yazarak doğrulayabilirsiniz.

Aşağıdakine benzer bir ekran görüntüsü alacaksınız.

Bu yüklü go sürümünü gösterecektir.

 


İlk Go Programı

GoOrnekleri adlı bir klasör oluşturun. Go programlarımızı bu klasörde oluşturacaksınız.  Visual Code gibi bir metin editörü açıp, proje dizini olarak bu klasörü belirtin. ilk_program.go adında bir dosya açıp, aşağıdaki kodları ekleyin.

Şimdi terminalde aşağıdaki komutu verelim. <dosyaadı> oluşturmak istediğimiz go dosyasının adı olarak belirtilecektir.

programı çalıştırdığınızda yukarıdakine benzer bir çıktı alırsınız.

Şimdi yukarıdaki programı inceleyelim.

package main – Her go programı bir paket adı ile başlamalıdır. Go, paketleri başka bir go programında kullanmamıza izin veriyor ve bu nedenle kodun yeniden kullanılabilirliğini destekliyor. Bir go programının çalıştırılması main adlı paketin içindeki kodla başlar.

import fmt – fmt paketini alır. Bu paket, I/O  işlevlerini uygular.

func main() – Bu, program yürütmenin başladığı işlevdir. Ana işlev her zaman ana pakete yerleştirilmelidir. main() altına kodu {} içine yazabilirsiniz.

fmt.Println – Bu, ekrandaki metni fmt’nin Println işlevi ile yazdırır.

Not: Bahsettiğinizde, aşağıdaki bölümlerde kodu çalıştır/run ifadesi, kodu .go uzantılı bir dosyaya kaydetmek ve sözdizimini kullanarak çalıştırmak anlamına gelir.

Bir Go Programı Nasıl Okunur

Bu programa daha detaylı bakalım. Go programları yukarıdan aşağıya, soldan sağa okunur. (bir kitap gibi) İlk satır şöyle der:

Bu bir “paket bildirimi” olarak bilinir. Her Go programı bir paket bildirimi ile başlamalıdır. Paketler Go’nun kodu düzenleme ve yeniden kullanma yöntemidir. İki tür Go programı vardır: yürütülebilir dosyalar ve kütüphaneler. Yürütülebilir uygulamalar, doğrudan terminalden çalıştırabileceğimiz program türleridir. (Windows’ta .exe ile bitiyorlar) Kütüphaneler birlikte paketlediğimiz kod koleksiyonlarıdır, böylece diğer programlarda kullanabiliriz. Kütüphaneleri daha sonra daha detaylı inceleyeceğiz, çünkü bu satırı yazdığınız herhangi bir programa dahil ettiğinizden emin olun.

Bir sonraki satır boş bir satır. Bilgisayarlar özel karakterli (veya birkaç karakterli) yeni satırları temsil eder. Yeni satırlar, boşluklar ve sekmeler boşluk olarak bilinir (çünkü onları göremezsiniz). Go çoğunlukla boşluklarla ilgilenmez, programları okumayı kolaylaştırmak için kullanırız. (Bu satırı kaldırabilirseniz program aynı şekilde davranır.)

O zaman şunu görüyoruz:

import anahtar sözcüğü, programımızla kullanmak için diğer paketlerden gelen kodları nasıl eklediğimizdir. fmt paketi (format için shorthand) giriş ve çıkış için formatlama uygular. Paketler hakkında az önce öğrendiklerimizi göz önüne alındığında, fmt paketinin dosyalarının üst kısmında ne içereceğini düşünüyorsunuz?

Yukarıdaki fmt’nin çift tırnak işareti ile çevrili olduğuna dikkat edin. Bunun gibi çift tırnak işaretlerinin kullanılması, bir tür “ifade” olan “string literal” olarak bilinir. go dizelerinde belirli bir uzunlukta bir karakter dizisini (harfler, sayılar, semboller,…) temsil eder. Dizeler bir sonraki bölümde daha ayrıntılı olarak açıklanmaktadır, ancak şimdilik akılda tutulması gereken en önemli şey bir açılış “karakterinin sonunda başka bir karakter takip etmesi gerekir” karakteridir ve ikisi arasındaki her şeyin dizgide yer almasıdır. (“Karakterin kendisi dizgenin bir parçası değildir)

// ile başlayan satır, yorum olarak bilinir. Yorumlar Go derleyicisi tarafından yok sayılır ve kendi iyiliğiniz için oradadır (veya programınız için kaynak kodunu kim seçerse). Go iki farklı yorum stilini destekler: // ile satırın sonu arasındaki tüm metnin yorumun bir parçası olduğu yorumlar / *     */ arasındaki her şeyin yorumun bir parçası olduğu yorumlar. (Ve birden fazla satır içerebilir)

Bundan sonra bir işlev bildirimi görürsünüz:

İşlevler bir Go programının yapı taşlarıdır. Girdileri, çıktıları ve sırayla ifadeleri adı verilen bir dizi adımı vardır. Tüm işlevler, func işlevi ile başlayan ve işlev adı (bu durumda ana), parantezlerle çevrili sıfır veya daha fazla “parametre” listesi, isteğe bağlı bir dönüş türü ve kıvrımlı parantezlerle çevrili bir “gövde” ile başlar. Bu işlevin hiçbir parametresi yoktur, hiçbir şey döndürmez ve yalnızca bir ifadeye sahiptir. Ana isim özeldir çünkü programı çalıştırdığınızda çağrılan işlev budur.

Programımızın son parçası bu satır:

Bu ifade üç bileşenden oluşmaktadır. İlk önce Println adındaki fmt paketinin içindeki başka bir fonksiyona erişiriz (bu, fmt.Println parçası, Println, Print Line anlamına gelir). Daha sonra, Merhaba Dünya! içeren yeni bir dize yaratır ve ilk ve tek argüman olarak dizeyle çalışan bu dizeyi çağırır (çağrı veya yürütme olarak da bilinir).

Bu noktada biz zaten çok fazla yeni terminoloji gördük ve biraz bunalmış olabilirsiniz. Bazen, programınızı kasten yüksek sesle okumak yararlı olabilir. Yeni yazdığımız programın bir okuması şöyle olabilir:

fmt kütüphanesine referans veren ve main adlı bir fonksiyon içeren yeni bir çalıştırılabilir program yaratın. Bu işlev hiçbir argüman almaz, hiçbir şey döndürmez ve aşağıdakileri yapar: fmt paketinin içindeki Println işlevine erişin ve bir argüman kullanarak çağırın – Merhaba Dünya! dizesi.

Println işlevi bu programdaki asıl işi yapar. Terminalinize aşağıdakileri yazarak bunun hakkında daha fazla bilgi edinebilirsiniz:


Veri tipleri

Tipler (veri tipleri) değişkende saklanan değerin tipini, fonksiyonun döndürdüğü değerin tipini, vb.

Go’da üç temel tip vardır.

Tam Sayı Tipleri

Go’nun tamsayı türleri: uint8, uint16, uint32, uint64, int8, int16, int32 ve int64. 8, 16, 32 ve 64 bize her bir tipin kaç bit kullandığını anlatıyor.

uint “işaretsiz tam sayı”,

int ise “işaretli tam sayı” anlamına gelir.

İşaretsiz tamsayılar yalnızca pozitif sayılar (veya sıfır) içerir.

  • int8 – 8 bit işaretli tam sayılar.
  • int16 – 16 bit işaretli tam sayılar.
  • int32 – 32 bit işaretli tam sayılar.
  • int64 – 64 bit işaretli tam sayılar.
  • uint8 – 8 bit işaretsiz tamsayılar.
  • uint16 – 16 bit işaretsiz tamsayılar.
  • uint32 – 32 bit işaretsiz tamsayılar.
  • uint64 – 64 bit işaretsiz tamsayılar.

Ayrıca iki takma ad vardır: uint8 ile aynı olan bayt ve int32 ile aynı olan rune.

Bayt, bilgisayarlarda kullanılan son derece yaygın bir ölçüm birimidir (1 bayt = 8 bit, 1024 bayt = 1 kilobayt, 1024 kilobayt = 1 megabayt,…) ve bu nedenle Go bayt veri türü genellikle diğer türlerin tanımında kullanılır. Makineye bağlı 3 tamsayı türü de vardır: uint, int ve uintptr. Makineye bağlıdır çünkü boyutları, kullandığınız mimarinin türüne bağlıdır.

 

Ondalıklı (Kayan nokta) Sayılar

Kayan nokta sayıları, ondalık bileşen içeren sayılardır (gerçek sayılar). (1.234, 123.4, 0.00001234, 12340000) Bir bilgisayardaki gerçek temsilleri oldukça karmaşık ve bunların nasıl kullanılacağını bilmek için gerçekten gerekli değil. Şimdilik sadece aşağıdakileri aklımızda tutabilirsiniz.

Go iki kayan nokta tipine sahiptir: float32 ve float64 (aynı zamanda sırasıyla tek hassasiyet ve çift hassasiyet olarak da adlandırılır) ve ayrıca karmaşık sayıları (hayali parçalara sahip sayılar) temsil etmek için iki ek türün yanı sıra: complex64 ve complex128 sayıları vardır. Genel olarak kayan nokta sayıları ile çalışırken float64 ile bağlantı kurarız.

  • float32 – 32 bit kayan nokta sayıları.
  • float64 – 64 bit kayan nokta sayıları.
  • complex64 – float32 gerçek ve hayali parçalara sahip.
  • complex128 – float32 gerçek ve hayali parçalara sahiptir.

String Tipler

Bir bayt sırası (karakter) gösterir. Dize bitiştirme, çıkarma alt dize vb. gibi dizelerde çeşitli işlemler yapabilirsiniz.

Yukarıda dediğim gibi dize metni temsil etmek için kullanılan belirli bir uzunlukta bir karakter dizisidir. Go dizeleri ayrı ayrı baytlardan oluşur, genellikle her karakter için birer tane byte ile ifade edilir. (Çince gibi diğer dillerden gelen karakterler birden fazla byte ile gösterilir)

Dize değişmezleri, "Merhaba Dünya"  çift tırnak işaretleri kullanılarak oluşturulabilir veya  Merhaba Dünya ile yapılır. Bunların arasındaki fark, çift tırnaklı dizelerin yeni satırlar içerememesi ve özel kaçış dizilerine izin vermesidir. Örneğin, \n yeni bir satırla değiştirilir ve \t bir sekme karakteriyle değiştirilir.

Boolean Tipler

Boolean değeri (George Boole’den sonra adlandırılmış), true ve false (veya açık ve kapalı) temsil etmek için kullanılan özel bir 1 tam sayı türüdür. Üç mantıksal işleç boolean değerlerle kullanılır.

&& and
|| or
! not


Değişkenler

Şimdiye kadar sadece değerleri kullanan programlar gördük (sayılar, dizgiler, vb.), Ancak bu programlar özellikle kullanışlı değil. Gerçekten faydalı programlar yapmak için iki yeni kavram öğrenmeliyiz: değişkenler ve kontrol akışı ifadeleri. Bu bölüm değişkenleri daha ayrıntılı olarak inceleyecektir.

Değişkenler, bir tür değer depolayan bir hafıza konumunu işaret eder. tip parametresi (aşağıdaki sözdiziminde), bellek konumunda depolanabilecek değer türünü temsil eder.

Dize orijinal programdaki değişmez dizinin hala bu programda göründüğüne dikkat edin, ancak doğrudan Println işlevine göndermek yerine, bunun yerine bir değişkene atarız. Go’daki değişkenler önce var anahtar sözcüğü kullanılarak, ardından değişken adını (x), type (string) belirterek ve son olarak değişkene (Merhaba Dünya) bir değer atayarak yaratılır.

Değişken Tanımlama

Değişken sözdizimi kullanılarak bildirilebilir.

Bir kez bir değişkeni tanımladığınızda, değişkeni o tipin herhangi bir değerine atayabilirsiniz.

Ayrıca değer atama operatörü kullanarak bir değişkene ilk değer verebilirsiniz.

Değişkeni başlangıç değeriyle bildirirseniz, değişkene ait türün atanan değer türünden çıkarımını go dili kendisi yapabilir. Bu nedenle, aşağıdaki sözdizimini kullanarak bildirim sırasında türü ihmal edebilirsiniz.

Birden Fazla Değişken Tanımlama

Ayrıca, sözdizimi ile birden fazla değişken bildirebilirsiniz.

yada

Kapsam

Bölüm başında gördüğümüz programa geri dönersek:

Bu programı yazmanın bir başka yolu şöyle olabilir:

Değişkeni ana fonksiyonun dışına taşıdığımızı fark edin. Bu, diğer fonksiyonların bu değişkene erişebileceği anlamına gelir:

f işlevi şimdi x değişkenine erişebilir. Şimdi bunun yerine şunu yazdığımızı varsayalım:

Bu programı çalıştırırsanız bir hata alırsınız.

Değişken Tanımlama Örnekleri

Örnek: Aşağıdaki programda bazı değişken bildirimleri örnekleri var.

Çıktı:

Go ayrıca, var anahtar kelimesini atlayarak değişkenleri, değere sahip olarak bildirmenin kolay bir yolunu sunar.

Örnek:Değer okuma, okunan değeri değişkene aktarma ve değişkeni ekrana yazdırma


Sabitler

Go ayrıca sabitleri de destekliyor. Sabitler, temelde değerleri daha sonra değiştirilemeyen değişkenlerdir. Değişkenler yarattığınız şekilde yaratılırlar, ancak var anahtar sözcüğünü kullanmak yerine const anahtar sözcüğünü kullanırız:


Kontrol Yapıları

Artık değişkenleri nasıl kullanacağımızı bildiğimize göre, bazı yararlı programlar yazmaya başlamanın zamanı geldi. İlk önce, her biri kendi satırında olmak üzere 1’den başlayarak 10’a kadar sayılan bir program yazalım. Şimdiye kadar öğrendiklerimizi kullanarak şunu yazabiliriz:

yada

Ancak bu programların her ikisi de yazmak için oldukça sıkıcı. İhtiyacımız olan şey, defalarca bir şeyler yapmanın bir yoludur.

for Döngüsü

Döngüler, bir koşula bağlı olarak art arda bir deyim bloğunu yürütmek için kullanılır. Programlama dillerinin çoğu, 3 tür döngü sağlar. Ancak Go sadece for döngüsünü destekler.

For döngüsünün sözdizimi

başlama_ifadesi: ilk önce (ve sadece bir kez) gerçekleştirilir.(zorunlu değil)

değerlendirme_ifadesi: Döngünün devam edip etmeyeceği değerlendirilir ve eğer doğruysa bloğun içindeki kod çalıştırılır.

değişim_ifadesi: değerlendirme_ifadesinin değerini değiştirmek için başlama_ifadesini artan yada azalan şekilde değiştirme işlemi yapar.(zorunlu değil)

Nasıl Çalışır: Değerlendirme ifadesi doğru olduğu sürece {  } bloklar arasındaki kod/kodlar çalıştırılır. Değerlendirme ifadesi false değerini ürettiğinde döngüden sonraki bloktan devam eder.

Örnek: Aşağıdaki programı bir dosyaya kopyalayın ve 1 ila 5 arasındaki sayıları ekrana basan kodları inceleyin:

Çıktı:

 

Örnek: Önceki programımızı bir for ifadesi kullanarak yeniden yazmak şuna benziyor:

Çıktı:

if else karar yapısı

Şimdi yazdığımız programı değiştirelim, böylece her satırda sadece 1-10 sayıları yazdırmak yerine, sayının sayının çift mi tek mi olduğunu yazdıralım. Bunun gibi:

Öncelikle bir sayının çift mi yoksa tek mi olduğunu tespit etmenin bir yoluna ihtiyacımız var. Söylemenin kolay bir yolu, sayıyı 2’ye bölmektir. Kalan hiçbir şeyiniz yoksa, o zaman sayı çift olur, aksi halde tektir. Öyleyse Go’daki bölünmeden sonra kalanları nasıl bulacağız? % operatörünü kullanıyoruz. 1 % 2 eşittir12 % 2 eşittir 03 % 2 eşittir1 vb

Daha sonra, bir koşula dayanarak farklı şeyler yapmayı seçmenin bir yoluna ihtiyacımız var. Bunun için if ifadesini kullanıyoruz:

Şimdi if else yazım kuralına bir bakalım:

Burada koşul değerlendirilir ve doğru  ise ifadeler_1 çalıştırılır, aksi takdirde ifadeler_2 çalıştırılır.

if deyimini else olmadan da kullanabilirsiniz. Ayrıca başka ifadeler varsa zincirleme yapmış olabilirsiniz. Aşağıdaki programlar, if else hakkında daha fazla bilgi verecektir.

Aşağıdaki programı yürütün. Bir sayı, x, 10’dan küçük olup olmadığını kontrol eder,eğer doğru ise “x 10’dan küçük” yazacaktır.

Burada x değeri 10’dan büyük olduğundan, blok koşulu yürütmez içerideki ifade çalışmamış olur.

Şimdi aşağıdaki programa bakınız. Eğer if değerlendirmesinin başarısızlığı üzerine çalıştırılacak başka bir bloğumuz var.

Örnek: Şimdi yukarıdaki 1-10 arasındaki çift ve tek sayıları ayırma örneğini tekrar döngü ve if else ile yapalım.

Çıktı:

switch

switch, başka bir koşullu ifadedir. switchifadeleri bir ifadeyi değerlendirir ve sonuç bir dizi kullanılabilir değerle (caseler) karşılaştırılır. Bir eşleşme bulunduğunda, o eşleşmeyle ilgili ifadeler (case) yürütülür. Eşleşme bulunamazsa hiçbir şey yürütülmez. Başka eşleşme bulunmazsa yürütülecek olanı değiştirmek için varsayılan bir durum da ekleyebilirsiniz.

switch sözdizimi:

Diyelim ki numaralara isimler basan bir program yazmak istedik. if-else ile bunu yapmak mümkün. Önce if-else kullanarak programı yapalım.

Yukarıdaki örneği, az önce öğrendiğimiz switch ifadesini kullanarak karmaşadan daha sade olarak yazmak mümkün hale getirebiliriz.


Diziler(Arrays), Dilimler(Slices) ve Haritalar(Maps)

Diziler(Arrays)

Dizi, aynı türden öğeler dizisinin adlandırılmış sabit bir boyutunu temsil eder. İçinde hem tamsayı hem de karakter içeren bir diziniz olamaz. Bir dizinin boyutunu tanımladıktan sonra tekrar değiştiremezsiniz.

Bir dizi sözdizimi:

Diziye Değer Atama: Her dizi elemanına sözdizimi kullanılarak değer atanabilir

Dizinin index numaraları 0’dan dizi boyutu-1 şeklindedir. (0- [boyut-1]) aralığında index numaraları vardır.

Sözdizimini kullanarak bildirim sırasında dizi öğelerine değer atayabilirsiniz.

Dizi boyutunu  ile değiştirerek diziyi değerlerle bildirirken size parametresini de görmezden gelebilirsiniz; derleyici değerlerin uzunluğunu bulur.

Sözdizimi:

Dizi Uzunluğu: Dizinin uzunluğunu len kullanarak bulabilirsiniz.

Örnek: Diziyi anlamak için aşağıdaki örneği yürütün

Çıktı:

 

Dilimler(Slices)

Dilim, dizinin bir kısmı veya kesimidir. Ya da işaret ettiği temel dizinin kısmi görünümüdür. Dilim adını ve dizin numarasını, bir dizide yaptığınız gibi, bir dilimin öğelerine erişebilirsiniz. Bir dizinin uzunluğunu değiştiremezsiniz, ancak bir dilimin boyutunu değiştirebilirsiniz.

Bir dilimin içeriği aslında bir dizinin elemanlarına işaretçilerdir. Dilimdeki herhangi bir öğeyi değiştirirseniz, altta yatan dizi içeriği de etkilenir.

 İşte bir dilim örneği:

Bu ve bir dizi arasındaki tek fark, parantez arasındaki eksik uzunluktur. Bu durumda x, 0(sıfır) uzunluğunda yaratılmıştır.

Dilim oluşturmak istiyorsanız, yerleşik make işlevini kullanmanız gerekir:

Dilimler her zaman bazı dizilerle ilişkilendirilir ve diziden asla daha uzun olmamasına rağmen, daha küçük olabilirler. Make işlevi ayrıca bir üçüncü parametreye de izin verir:

10, dilimin işaret ettiği temel dizinin kapasitesini gösterir:

Tanımlı bir diziden dilim oluşturma örneği:

Bu, dizi_adi adlı bir diziden slice_adi adlı bir dilim yaratacak, dizindeki baslangic ile bitis arasındaki değerleri slice’a aktaracaktır.

Aşağıdaki programı yürütün. Program diziden bir dilim oluşturur ve yazdırır. Ayrıca dilimdeki içerikleri değiştirmenin asıl diziyi değiştireceğini de görebilirsiniz.

Çıktı:

Slice Fonksiyonları

Dilimlere uygulayabileceğiniz bazı işlevler vardır.

len (dilim_adı) – dilimin uzunluğunu döndürür

append (dilim_adı, değer_1, değer_2) – Mevcut bir dilime değer_1 ve değer_2 eklemek için kullanılır.

append (slice_1, slice_2…) – slice_1’e slice_2 ekler

Aşağıdaki programı yürütün.

Çıktı:

Haritalar(Maps)

Harita, sıradışı bir anahtar / değer çiftleri koleksiyonudur. Bir ilişkisel dizi, bir karma tablo veya sözlük olarak da bilinen haritalar, ilişkili bir anahtar tarafından bir değer aramak için kullanılır. İşte Go’da bir harita örneği:

Harita türü, anahtar kelime haritası, ardından parantez içindeki anahtar türü ve son olarak değer türü tarafından gösterilir. Bunu yüksek sesle okuyacak olsaydınız, “x, dizelerin bir haritasıdır” derdiniz.

Diziler ve dilimler gibi haritalara parantez kullanarak erişilebilir. Aşağıdaki programı çalıştırmayı deneyin:

Buna benzer bir hata görmelisiniz:

Şimdiye kadar sadece derleme zamanı hataları gördük. Bu bir çalışma zamanı hatası örneğidir. Adından da anlaşılacağı gibi, programı çalıştırdığınızda çalışma zamanı hataları, programı derlemeye çalıştığınızda derleme zamanı hataları olur.

Programımızdaki sorun, kullanmadan önce haritaların başlatılması gerektiğidir. Bunu yazmalıydık:

Çıktı:

Bu programı çalıştırırsanız, 10 görüntülenen görmelisiniz.

x[“key1”] = 10 ifadesi, dizilerde gördüğümüze benzer, ancak tamsayı yerine anahtar, dizedir, çünkü haritanın anahtar türü dizedir. Anahtar int türüyle haritalar da oluşturabiliriz:

Bu bir diziye çok benziyor ama birkaç fark var. İlk önce bir haritanın uzunluğu (len(x) yaparak bulunur), ona yeni öğeler ekledikçe değişebilir. İlk oluşturulduğunda 0 uzunluğuna sahiptir, x [1] = 10 değerinden sonra 1 uzunluğuna sahiptir. İkinci haritalar sıralı değildir. x[1] ‘e sahibiz ve bir x [0] olması gerektiğini belirten bir diziyle, ancak haritaların bu gereksinimi yoktur.

Yerleşik delete işlevini kullanarak öğeleri bir haritadan da silebiliriz:

map kullanan bir örnek programa bakalım:

Çıktı:

Listede olmayan bir öğeyi aramaya çalıştığımızı varsayalım:

Eğer bunu çalıştırırsan, hiçbir şeyin geri dönmediğini görmelisin. Teknik olarak bir harita, değer türü için sıfır değerini döndürür (dizeler için boş dizedir). Bir koşulda sıfır değerini kontrol etmemize rağmen (kisaltmalar[“tek”] == “”) ile Go daha iyi bir yol sunar:

Haritanın bir öğesine erişmek, yalnızca bir tane yerine iki değer döndürür. Birincisi aramanın sonucudur, ikincisi bize aramanın başarılı olup olmadığını söyler. Go’da sık sık şöyle kod görüyoruz:

 


Fonksiyonlar(İşlevler)

Bir işlev, belirli bir görevi gerçekleştiren ifadeler bloğunu temsil eder. Bir fonksiyon bildirimi bize fonksiyon adını, dönüş tipini ve giriş parametrelerini bildirir. İşlev tanımı, işlevde bulunan kodu temsil eder. İşlev bildirmek için sözdizimi

Parametreler ve dönüş tipleri isteğe bağlıdır. Ayrıca, bir işlevden birden çok değer döndürebilirsiniz.

Ortalama hesaplamak için bir fonksiyon yazalım. Daha önce for döngüsünü anlatırken kullandığımız bir örneği burada bir işlev içinde ortalama hesaplamak için nasıl kullanıyoruz inceleyelim.

Çıktı:

Birden Fazla Değer Döndürme

Go bir işlevden birden fazla değer döndürme yeteneğine de sahiptir:

Aşağıdaki örneği çalıştıralım. Burada hesap isimli fonksiyon 2 sayı kabul eder, toplama ve çıkarma işlemini gerçekleştirir ve her iki değeri de döndürür.

Çıktı:

Arguman Kullanımı

Go işlevindeki son parametre için özel bir form var:

Son parametrenin türünün adından önce seçeneğini kullanarak, bu parametrelerin sıfır veya daha fazlasını aldığını belirtebilirsiniz. Bu durumda sıfır ya da daha fazla inç alıyoruz. Fonksiyonu, istediğimiz kadar girdi aktarabilmemiz dışında, diğer fonksiyonlar gibi çağırıyoruz.

Anonim Fonksiyon

İşlevlerin içinde işlevler oluşturmak mümkündür:

topla func(int, int) int türüne sahip bir yerel değişkendir (iki inç alan ve bir int döndüren bir işlevdir). Bunun gibi bir yerel işlev oluşturduğunuzda, diğer yerel değişkenlere de erişebilir.

 

Rercursive Fonksiyon

Bir işlev kendini çağırabilir. En basit özyinelemeli fonksiyon örneği olarak sayının faktöriyelini hesaplayalım.

Anonim ve özyineleme, fonksiyonel programlama olarak bilinen bir paradigmanın temelini oluşturan güçlü programlama teknikleridir.

Defer, Panic & Recover

Go, fonksiyon tamamlandıktan sonra çalıştırılacak bir fonksiyon çağrısını zamanlayan defer adında özel bir ifadeye sahiptir. Aşağıdaki örneği düşünün:

Çıktı:

Bu program önce 1’i sonra 2’yi yazdırır. Temel olarak erteleme, çağrıyı işlevin sonuna kadar taşır:

erteleme genellikle kaynakların bir şekilde serbest bırakılması gerektiğinde kullanılır. Örneğin bir dosyayı açtığımızda daha sonra kapattığımızdan emin olmalıyız. Erteleme ile:

Bunun 3 avantajı vardır: (1) Yakın çağrımızı Açık çağrımızın yakınında tutar, böylece anlaşılması daha kolaydır, (2) fonksiyonumuzda birden fazla dönüş ifadesi varsa (belki bir if ve diğerinde diğeri) Kapat her ikisinden önce gerçekleşir ve (3) ertelenmiş fonksiyonlar bir çalışma zamanı paniği meydana gelse bile çalıştırılır.

Panic & Recover

Daha önce panik fonksiyonunu çağıran bir fonksiyon oluşturduk. Yerleşik kurtarma işleviyle çalışma zamanı paniklerini halledebiliriz. recover paniği durdurur ve panik çağrısına iletilen değeri döndürür. Bu şekilde kullanmak cazip olabilir:

Ancak bu durumda recover çağrısı asla gerçekleşmeyecektir çünkü panik çağrısı hemen fonksiyonun yürütülmesini durdurur. Bunun yerine erteleme ile eşleştirmeliyiz:

Panik genellikle bir programcı hatasını (örneğin, sınırların dışında bir dizinin dizinine erişmeye çalışmak, bir haritayı başlatmayı unutmak vb.) Veya kurtarmanın kolay bir yolu olmayan istisnai bir durumu belirtir. (Dolayısıyla “panik” adı)

 


İşaretçiler(Pointers)

Bağımsız değişken alan bir işlevi çağırdığımızda, bu bağımsız değişken işleve kopyalanır:

Bu programda, sıfır fonksiyonu ana fonksiyondaki orijinal x değişkenini değiştirmeyecektir. Ama ya isteseydik? Bunu yapmanın bir yolu, işaretçi olarak bilinen özel bir veri türü kullanmaktır:

İşaretçiler, bellekteki değerin kendisi yerine bir değerin depolandığı bir konuma başvurur. (Başka bir şeye işaret ederler) İşaretçi (* int) kullanarak sıfır işlevi orijinal değişkeni değiştirebilir.

* ve & operatörleri

GO’da bir işaretçi * (yıldız) karakteri ve ardından saklanan değerin türü kullanılarak temsil edilir. Sıfır fonksiyonunda xPtr bir int işaretçisidir.

* ayrıca işaret değişkenlerini “dereference” için de kullanılır. İşaretçinin kaydının kaldırılması, işaretçinin işaret ettiği değere erişmemizi sağlar. *xPtr = 0 yazdığımızda “int 0’ı xPtr’in başvurduğu bellek konumuna kaydet” diyoruz. Bunun yerine xPtr = 0‘ı denersek, bir derleyici hatası alırız çünkü xPtr bir int değildir *int, sadece başka bir *int verilebilir.

Son olarak, bir değişkenin adresini bulmak için & işlecini kullanırız. &x, * bir int olduğu için *int (int’e işaretçi) döndürür. Orijinal değişkeni değiştirmemize izin veren budur. &x ana ve xPtr sıfır aynı bellek konumuna karşılık gelir.

new

İşaretçi almanın başka bir yolu, yerleşik new işlevi kullanmaktır:

new, türü bağımsız değişken olarak alır, bu tür bir değere sığacak kadar bellek ayırır ve ona bir işaretçi döndürür.

Bazı programlama dillerinde yeni ile & arasında önemli bir fark vardır ve sonunda yeni ile yaratılan her şeyi silmek için çok dikkatli olunması gerekir. GO böyle değil, artık toplanan hiçbir şey olmadığında belleğin otomatik olarak temizlendiği anlamına gelen çöp toplanma yapısına sahip bir programlama dilidir.

İşaretçiler Go’nun yerleşik türleriyle nadiren kullanılır, ancak bir sonraki bölümde göreceğimiz gibi, yapılarla eşleştirildiğinde son derece yararlıdır.

Struct ve Interface

Her ne kadar Go’nun yerleşik veri türlerini kullanarak program yazmamız mümkün olsa da, bir noktada oldukça sıkıcı hale gelecektir.

Yapılar (Struct)

Yapı, kendisi tarafından aynı veya farklı türde bir öğe daha içeren kullanıcı tanımlı bir veri türüdür.

Bir yapı kullanmak 2 adımlı bir işlemdir.

İlk olarak, bir yapı türü oluşturun (beyan edin)

İkinci olarak, değerleri saklamak için bu türden değişkenler oluşturun.

Yapılar çoğunlukla ilgili verileri birlikte saklamak istediğinizde kullanılır.

Adı, yaşı ve adresi olan bir çalışan bilgisi düşünün. Bunu 2 şekilde halledebilirsiniz

3 dizi oluşturun – bir dizi çalışanların isimlerini, bir dizi yaşı ve üçüncü bir dizi yaşı saklar.

Ad, adres ve yaş olmak üzere 3 alanlı bir yapı türü bildirin. Her bir öğenin adı, adresi ve yaşı olan bir yapı nesnesi olduğu yapı tipinde bir dizi oluşturun.

İlk yaklaşım verimli değildir. Bu tür senaryolarda, yapılar daha uygundur.

Bir yapıyı sözdizimi:

Bir yapı bildirimi örneği

Burada musteri adlı yeni bir kullanıcı tanımlı tür oluşturulur. Artık sözdizimini kullanarak musteri türünde değişkenler oluşturabilirsiniz.

Örn:

musteri1 için değerleri şu şekilde ayarlayabilirsiniz:

Ayrıca bir yapı değişkeni değerler ile de oluşturabilir,

Burada, öğelerin sırasını korumanız gerekir. Ahmet isimle, adreslenecek bir sonraki elemanla ve en son yaşla eşleştirilecek.

Aşağıdaki kodu yürütün

Çıktı:

 

 

 

 

 

2 Yorum

Yorum yapmak için tıklayın