THT DUYURU
Golang Google’a ait insan diline en yakın olan dillerdendir, projelerin ve dökümanların paylaşım alanıdır

siber güvenlik eğitimi
Seçenekler

Go(Lang)'in Temellerini Öğrenelim

x4807 - ait Kullanıcı Resmi (Avatar)
user
Üyelik tarihi:
08/2019
Mesajlar:
780
Konular:
101
Ticaret:
(0) %
13
622
bir Hafta önce
#1
Selamlar herkese, bu konuda sizlere Go dilinin temellerinden bahsedeceğim. İyi okumalar dilerim



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.



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;




Alıntı:
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;

Alıntı:
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 ....).



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...



"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.



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.



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.



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;



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.




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.





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.



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.



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.



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.



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.



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.


Okuduğunuz için teşekkür ederim. Saygılar.
Konu x4807 tarafından (bir Hafta önce Saat 15:47 ) değiştirilmiştir.
IQ
IQ - ait Kullanıcı Resmi (Avatar)
BH80'in Öğrencisi
Üyelik tarihi:
04/2020
Nereden:
-Türkistan-
Mesajlar:
2.622
Konular:
174
Teşekkür (Etti):
602
Teşekkür (Aldı):
809
Ticaret:
(0) %
bir Hafta önce
#2
Eline emeğine sağlık
---------------------


BH80
P4RS
Rey,Lost
x4807 Teşekkür etti.
P4RS - ait Kullanıcı Resmi (Avatar)
Özel Üye
Üyelik tarihi:
01/2017
Nereden:
Balkes
Yaş:
19
Mesajlar:
5.144
Konular:
626
Teşekkür (Etti):
1779
Teşekkür (Aldı):
3467
Ticaret:
(0) %
bir Hafta önce
#3
Ellerine sağlık aqu, sabit.
---------------------


𝖘𝖊𝖞𝖈𝖎𝖑𝖊𝖗
x4807 Teşekkür etti.
Ego1st - ait Kullanıcı Resmi (Avatar)
Yazılımcı
Üyelik tarihi:
03/2018
Nereden:
fatal err.
Mesajlar:
1.051
Konular:
94
Teşekkür (Etti):
225
Teşekkür (Aldı):
379
Ticaret:
(0) %
bir Hafta önce
#4
Eline sağlık
---------------------
x4807 Teşekkür etti.
x4807 - ait Kullanıcı Resmi (Avatar)
user
Üyelik tarihi:
08/2019
Mesajlar:
780
Konular:
101
Ticaret:
(0) %
bir Hafta önce
#5
Alıntı:
Profesör´isimli üyeden Alıntı Mesajı göster
Eline emeğine sağlık
Alıntı:
P4RS´isimli üyeden Alıntı Mesajı göster
Ellerine sağlık aqu, sabit.
Alıntı:
Ego1st´isimli üyeden Alıntı Mesajı göster
Eline sağlık
Destekleriniz için teşekkür ederim
Feqtico - ait Kullanıcı Resmi (Avatar)
Junior Hunter
Üyelik tarihi:
06/2020
Mesajlar:
219
Konular:
23
Teşekkür (Etti):
75
Teşekkür (Aldı):
71
Ticaret:
(0) %
bir Hafta önce
#6
Eline sağlık hocam
--------------------- “Yaratıcılık, sürekli bir sürprizdir.”
x4807 Teşekkür etti.
Ⱨ₳₵₭ĐɆⱤ₮ - ait Kullanıcı Resmi (Avatar)
Uzman Üye
Üyelik tarihi:
04/2019
Nereden:
Samsun
Mesajlar:
1.903
Konular:
58
Teşekkür (Etti):
818
Teşekkür (Aldı):
474
Ticaret:
(0) %
bir Hafta önce
#7
Mükemmel konu elinize sağlık hocam
---------------------
BiIeIim ki miIIi benIiğini biImeyen miIIetIer başka miIIetIere yem oIurIar.
ℳ.𝒦ℯ𝓂𝒶ℓ 𝒜𝓉𝒶𝓉𝓊̈𝓇𝓀
x4807 Teşekkür etti.
Warez7 - ait Kullanıcı Resmi (Avatar)
Moderatör
Üyelik tarihi:
05/2018
Mesajlar:
1.627
Konular:
85
Teşekkür (Etti):
72
Teşekkür (Aldı):
266
Ticaret:
(0) %
bir Hafta önce
#8
Elinize Sağlık
x4807 Teşekkür etti.
x4807 - ait Kullanıcı Resmi (Avatar)
user
Üyelik tarihi:
08/2019
Mesajlar:
780
Konular:
101
Ticaret:
(0) %
bir Hafta önce
#9
Alıntı:
Feqtico´isimli üyeden Alıntı Mesajı göster
Eline sağlık hocam
Alıntı:
Ⱨ₳₵₭ĐɆⱤ₮´isimli üyeden Alıntı Mesajı göster
Mükemmel konu elinize sağlık hocam
Alıntı:
Warez7´isimli üyeden Alıntı Mesajı göster
Elinize Sağlık
Eyvallah, teşekkürler
x4807 - ait Kullanıcı Resmi (Avatar)
user
Üyelik tarihi:
08/2019
Mesajlar:
780
Konular:
101
Ticaret:
(0) %
bir Hafta önce
#10
Görmeyenler için güncel +++++

Bookmarks


« Önceki Konu | Sonraki Konu »
Seçenekler