Go(Lang)'in Temellerini Öğrenelim

x4807

Katılımcı Üye
10 Ağu 2019
985
16
Selamlar herkese, bu konuda sizlere Go dilinin temellerinden bahsedeceğim. İyi okumalar dilerim


qrs0ut1.png



Go(Lang) Nedir?



GoLang, Google tarafından 2007 yılında geliştirilmeye başlanan bir açık-kaynak programlama dilidir. Sistem programlama(system programming) için tasarlanmıştır ve derlenmiş(compiled), statik tipli(static typed) bir dildir. Windows, Linux, OS X gibi popüler sistemleri desteklemekle beraber 2015 yılında akıllı telefonlar için de geliştirilmeye başlanmıştır. Çapraz platform(cross-platform) bir prorgamlama dili diyebiliriz. İlk başta bir deney olarak çıkmıştır. Bu dilin oluşumu günümüzde fazlasıyla kullanılan diğer dillerin eksik ya da kullanışsız yönlerini tespit edip bu yönleri engellenmesi, aynı zamanda günümüzde popüler dillerin tercih edilme sebeplerini tespit ederek güzel, işe yarayan özelliklerinin harmanlanmasıyla gerçekleştirilmiştir. Topluluklarda c ile pythonun karışımı olduğu da söylenmektedir. Java, C++ gibi statik, güçlü olmakla beraber okunabilirliği de python gibidir. Keyword dediğimiz anahtar kelimeler go dilinde 25 adettir. Diğer dillerle karşılaştırmak gerekirse C dilinde 32, C++ dilinde 30(?), pythonda da 33 tane keyword bulunmaktadır. Ağ(network) ve çoklu işlem(multi processing) işlemleri desteklemektedir. Ek olarak belirtmek isterim ki röportajlar sırasında böyle bir dil yapmalarının sebebinin C++'ın karmaşık olduğunu belirtmişlerdir.




47m78xq.gif




Go(Lang) Kurulumu




Go dilinin kurulumu çok basittir. Fazla bir gereksinim istememektedir. Cihaza kurulması gerekenler git ve go'dur. Eğer git ve go kurulmassa cihazlarda go ile yazılmış programlar çalıştırılamaz. Kodlama ortamı için herhangi bir text editör tercih edilebilir. Ben Visual Studio Code kullanıyorum.



GoLang Kurulum Kaynak 1 [EN]


GoLang Kurulum Kaynak 2 [TR]

Visual Studio Code İndir



İlk Programımızı Yazalım




Gerekli kurulumlar da yapıldığında göre artık go yazmaya başlayabiliriz. Biz de herzaman ki geleneğe uyarak tabiki Dünya'ya merhaba diyeceğiz. İlk başta kullanacağımız text editörünü açalım. Yeni bir dosya oluşturalım, adlandırıp uzantısını go yapalım. Aşağıdaki kodu girelim ve programı kaydedelim.




Kod:
package main

import "fmt"

func main() {

    fmt.Println("Selamlar GoLang Dünyası ")

}







Kodları şimdilik pek anlamamanız normal fakat ilk programımız hazır diyebiliriz. Çalıştırmamız için cmd ya da kullandığınız komut istemcisi üzerinde programın bulunduğu dizine gittikten sonra aşağıdaki komutu yazmamız yeterli olacaktır;





5aE7rL.png




go run dosyaadi.go






Peki her yazdığımız programı böyle mi çalıştıracağız? Tabiki de hayır! Uzantısına da bakarsanız göreceksiniz ki bu bir go dosyası. Eğer bunu çalıştırılabilir yani executable hale getirmek istersek aşağıdaki komutu yazmamız gerekir;



go build dosyaadi.go






Yazmış olduğumuz programın bulunduğu dizine gittiğimizde aşağıdaki gibi bir görüntü ile karşılaşacaksınızdır. Yani sadece bir go dosyası var ve çalıştırabilmemiz için komut istemcisinden bulunduğa dizine gidip yukarıda bahsettiğim komutu kullanmamız gerekir(go run ....).


222s23j.png



Ancak komut istemcisi üzerinden programın bulunduğu dizine gidip programı çalıştırılabilir hale getirdiğimiz komutu(go build....) girdikten sonra programın olduğu dizinde yazmış olduğumuz programın ".exe" formatında executable(çalıştırılabilir) olduğunu göreceksiniz. Hadi şimdi go dilinin derinliklerine inelim...






47m78xq.gif



"fmt" Paketi



Yazmış olduğumuz ilk kodda da görebileceğiniz üzere "fmt" isimli bir kütüphane kullandık. Bu kütüphane belki de go ile yazacağınız programların çoğunda geçecektir. Çünkü içerisinde I/O dediğimiz input/output yani girdi ve çıktı işlemleri gerçekleştirebileceğimiz fonksiyonları barındırır. Buradaki fonksiyonlar C dilindekilere benzemektedir ancak biraz daha basitleştirilmiş halleri diyebiliriz. Go dilinde bir paketin belirli bir özelliği kullanılmak istendiği zaman genellikle "paketismi.fonksiyon" şeklinde yazılmaktadır. "fmt" paketinde bulunan bir fonksiyonu da yine aynı şekilde kullanırız. Örnek olarak aşağıdaki fotoğrafa baktığımızda fmt paketinde bulunan birkaç fonksiyonu ve özeliklerini görebilirsiniz. Bu paketin detaylarını buraya tıklayarak öğrenebilirsiniz.



5hujevx.png



Kod:
package main

import "fmt"

func main() {

    var a string                             // Bu satırda a isimli bir string değişken belirlendi
    fmt.Println("1. Bu println fonksiyonu")  // 2.'yi yazdırdı ve alt satıra geçti
    fmt.Print("2. Bu da print fonksiyonu\n") // Eğer '\n' olmasaydı 2. ve 3. bitişik, yanyana olurdu.
    fmt.Printf("3. %T", a)                   // 'a' değişkeninin türünü yazdırdı. "%T" kullanıldığı için.    (Type)

}




Değişkenler



Go dilinde birkaç yöntemle değişkenler tanımlanabilir. Aşağıda bulunan resimde go dilinde değişken tanımlamalarının nasıl yapıldığı gösterilmiştir.

Ancak önemli bir nokta ise bu kullanımlar değişkeni "ilk" defa tanımlarken kullanılmaktadır. Değeri değiştirilecekse eğer "=" yeterlidir.



ne04zeu.png


Kod:
package main

import "fmt"

func main() {

    var degiskenadi = "Burası da değişkenin içeriği" // String yani yazı formatında değişken tanımladık
    var degisken1, degisken2 = 50, 100  // İkisi de integer(int)(tam sayı) formatında 2 değişken tanımladık
    var turkhackteam = true            //Boolean (True ya da False) olabilecek bir değişken tanımladık
    tht := "bu da bir değişken"

    fmt.Println(degiskenadi)
    fmt.Println(degisken1)
    fmt.Println(degisken2)
    fmt.Println(turkhackteam)
    fmt.Println(tht)
}






For Döngüsü



Go dilinde "while" döngüsü bulunmamaktadır. Yapılan işlemler herzaman for ile gerçekleştirilmektedir. Aşağıdan çok temel bir for döngüsü kullanımını görebilirsiniz.




bnl8s4j.png



Kod:
package main

import "fmt"

func main() {

    for i := 0; i < 10; i++ {

        fmt.Println("Burası for döngüsü devam ettikçe gerçekleşir.")
    }

}



Başka bir örnek;

guo32s9.png



Kod:
package main

import "fmt"

func main() {

    for i := 0; i < 10; i++ {
        fmt.Println(i)
    }

}


If/Else



Go dilinde herhangi bir "else" durumu olmadan da "if" kullanabilirsiniz. Hemen hemen diğer dillerdeki kullanımları benzemektedir.



1. Hangi durumun gerçekleşeceğini programın çıktısı belirler.

2. Birden çok durum için birçok opsiyon olur

3. If bloğu içerisinde herhangi bir durum uygulanmassa, (oluşturulduysa) "else" bloğu çalıştırılır.


7ipj3uf.png



Kod:
package main

import "fmt"

func main() {

    var a string = "1234"

    if a == "4321" {
        fmt.Println("a 4321'dir")
    } else if a == "0123" {
        fmt.Println("a 0123'tür.")
    } else {
        fmt.Println("a'nın değeri başkadır.")
    }

}




Switch/Case



Switch case durumlarının kullanımları da if/else'e benzemektedir. Genellikle bir durumun birden çok olasılığı varsa kullanılır.



1. Hangi durumun gerçekleşeceğini kişi belirler.

2. Bir durum için birçok olasılık olur

3. Oluşturulan durumlardan hiçbiri tutmuyorsa eğer oluşturulmuşsa "default" yani varsayılan durum gerçekleştirilir.

gpbo0fv.png




Kod:
package main

import "fmt"

func main() {

    num := 2002

    switch num {
    case 2015:
        fmt.Println("Turkhackteam 2015 yılında kuruldu.")
    case 2020:
        fmt.Println("Turkhackteam 2020 yılında kuruldu.")
    case 2002:
        fmt.Println("Turkhackteam 2002 yılında kuruldu.")
    }
}




Diziler



İngilizcede arrays olarak geçmektedirler. Toplu işlemlerde ciddi kolaylık sağlarlar.


gcbe90x.png



Kod:
package main

import "fmt"

func main() {

    var dizi1 [10]int // İçerisinde 10 tane tam sayı bulunduran bir dizi oluşturduk
    dizi1[0] = 1      // Dizide 1. sayının 1 olduğunu belirttik
    dizi1[9] = 10     // Dizide 10. sayının 10 olduğunu belirttik
    dizi1[1] = 3500   // Dizide 2. sayının 3500 olduğunu belirttik

    fmt.Println(dizi1) //Diziyi yazdırdık

    //1. 2. ve 10. elemanlar dışında diğer elemanlara değer girmediğimiz için 0 yazdırdı
}


Fonksiyonlar



Fonksiyonların kullanımı diğer dillerideki gibidir. Kodların okunabilirliğini ve işlevlerini arttırmaktadırlar.


hgi3281.png




Kod:
package main

import "fmt"

func toplama(sayi1 int, sayi2 int) int {
    return sayi1 + sayi2
}

func cikti(metin string) string {

    fmt.Println(metin)

    return metin
}

func main() {

    fmt.Println(toplama(5, 10))
    cikti("TurkHackTeam //aqua")

}




İşaretçiler



Pointer olarak geçmektedirler. Herhangi bir değişkenin ya da veri yapısının RAM'de nerede olduğunu belirten veri tipidir. Aşağıda bulunan örnekte

pointer kullanarak golang'te nasıl kullanıcıdan input alındığını görebilirsiniz.



r8w9ddg.png



Kod:
package main

import "fmt"

func main() {
    var username string

    fmt.Print("Lütfen THT kullanıcı adınızı giriniz: ")

    fmt.Scanln(&username)

    fmt.Println("Hoşgeldiniz,", username)
}




GoLang ile Veritabanı İşlemleri



Veritabanları, bir grup verileri bir arada ve düzenli şekilde tutan yapılardır. Sunucularda, websitelerde günümüzde çoğu yerde bulunmaktadırlar. Go dilinde bulunan mongodb, sql gibi kütüphaneler aracılığıyla da bu veritabanları üzerinde işlem yapabiliriz. Ben sizlere uygulamalı gösterirken sqlite veritabanını kullanacağım. Go dilinde herhangi bir kütüphaneyi yüklemek için komut istemcisini açıp "go get ... " yazmamız yeterli olacaktır.



Öncelikle sqlite veritabanı kütüphanelerini komut istemcisi üzerinden indiriyoruz. (go get github.com/mattn/go-sqlite3) Herhangi bir hata ile karşılaşırsanız github üzerinden indirip go dosyalarının içerisine de atabilirsiniz. Ya da başka bir çözüm için buraya tıklayın.



Kullanacağımız kütüphaneyi kurduktan sonra şimdi de sqlite veritabanı oluşturmamız için kullanacağımız db browser'ı yüklememiz gerekmekte. Bu linkte tıklayarak cihazımıza uygun sürümü indiriyoruz. Ardından klasik kurulum gerçekleştiriyoruz.



11zlznt.png



Kurulum işlemleri tamamlandığına göre sıra veritabanı üzerinde işlem yapmakta. İlk olarak projemizin bulunduğu dizine bir veritabanı klasörü oluşturalım.



Programımızı çalıştırdıktan sonra "Yeni Veritabanı" butona basalım. Ardından açtığımız klasörün içerisine bir veritabanı dosyası oluşturalım.




sld8i2m.png
TinEcP.png




Ardından "users" isimli bir tablo oluşturalım ve içerisine tam sayı formatında id değişkeni ve string formatında user değişkeni atayalım.



Veritabanımız hazır. Artık golang ile bu veritabanı üzerinde işlem yapabiliriz. Öncelikle işlem yapabilmek adına veritabanı ile bir bağlantı oluşturmamız gerekir. Aşağıdaki komut ile veritabanına düzgün bağlantı kurulup kurulamadığını görebiliriz.




Kod:
package main

import (
    "database/sql"
)

func main() {
    veritabanı, _ := sql.Open("sqlite3", "db/database1.db")

    db, _ := veritabanı.Query("Select ' from users")

    db.Close()
    veritabanı.Close()



Veritabanı üzerinde bağlantı kurduktan sonra users tablosu içerisinde bir user verisi girmek için aşağıdaki kodu yazıyoruz.



Kod:
package main

import (
    "database/sql"
    "fmt"

)

func main() {
    // veritabanıyla bağlantı kuruyoruz
    veritabani, _ := sql.Open("sqlite3", "db/database1.db")

    //veritabanına yeni veriyi nereye ekleyeceğimizi belirtiyoruz
    conn, _ := veritabani.Prepare("insert into users (name) values (?)")

    // veritabanına yeni isim ekliyoruz
    veriekle, _ := conn.Exec("TurkHackTeam Aqua")

    // Son eklenen user verisinin id numarasını alıyoruz
    idd, _ := veriekle.LastInsertId()

    // aldığımız id'yi yazdırıyoruz
    fmt.Println(idd)

    //Veritabanı bağlantısını kapatıyoruz.
    veritabani.Close()
}




Yukarıda temel örnekler gibi golang ile de veritabanı işlemleri gerçekleştirebiliriz.



GoLang Dosya İşlemleri




Öncelikle en temelden dosya oluşturmak ile başlayalım. Aşağıda bulunan kodu yazıp programı çalıştırdığımızda programın olduğu dizinde vermiş olduğumuz ad ile bir dosya kaydedecektir.


Programı çalıştırdıktan sonra bulunduğu dizine gidip baktığımızda istediğimiz dosyayı oluşturduğunu görebiliyoruz.




Şimdi oluşturduğumuz dosya hakkında biraz bilgi edinelim. Yazacağımız komut ile adını, boyutunu, izinlerini, en son güncellendiği tarihi görebileceğiz.




Kod:
package main

import (
    "fmt"
    "os"
)

var fileinfo *os.FileInfo

func main() {

    fileinfo, _ := os.Stat("bubirdosyadir.txt")

    fmt.Println(fileinfo.Name())
    fmt.Println(fileinfo.Mode())
    fmt.Println(fileinfo.Size())
    fmt.Println(fileinfo.ModTime())
}




Ancak dosyanın içi boş ve hiçbir şey yazmadık. İçerisine bir yazı yazalım.



Bir yazı yazdıktan sonra programı çalıştırdığımızda program hakkında bilgileri elde ediyoruz.



Gördüğünüz gibi golang ile dosya işlemleri de yapılabilmekte. Vermiş olduğum örnekler çok basit ve yüzeysel gelmiş olabilir ancak kendiniz de çaba harcamadan maalesef kendinize bir şey katmanız zor.



47m78xq.gif



Okuduğunuz için teşekkür ederim. Saygılar.
 
Moderatör tarafında düzenlendi:
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.