Golang Temel Kavramlar: Veri Tipleri, Struct Yapıları ve Eşzamanlı Programlama

Bu yazıda, Golang (Go) diline başlangıç seviyesinde hakim olan geliştiricilerin, veri tipleri, struct gibi özel yapılar, pointer kullanımı, diziler, slice'lar ve map'ler ile fonksiyon ve interface tanımlarını öğrenmesi hedeflenmiştir.

Bu yazıda, Golang (Go) diline başlangıç seviyesinde hakim olan geliştiricilerin, veri tipleri, struct gibi özel yapılar, pointer kullanımı, diziler, slice'lar ve map'ler ile fonksiyon ve interface tanımlarını öğrenmesi hedeflenmiştir. Ayrıca eşzamanlı programlama için önemli olan goroutine ve worker havuzu yapıları anlatılarak, Go diline özgü pratik kullanımlar ve temel kütüphaneler hakkında detaylı bilgiler sunulmuştur.

Golang'de Temel Kavramlar ve Özel Yapılar

Bu yazıda Go dilindeki temel veri tipleri, özel yapılar (struct), eşzamanlı programlama için goroutine ve worker kavramlarını detaylıca inceleyeceğiz.

Temel Veri Tipleri

Go dilinde kullanılan temel veri tipleri aşağıdaki gibidir:

  • Integer: int, int8, int16, int32, int64

  • Unsigned Integer: uint, uint8, uint64 gibi

  • Float: float32, float64

  • String: string

  • Boolean: bool

  • Diğer: byte, rune

Örnek kullanım:

GO
var yas int = 30 var isim string = "Deniz" var fiyat float64 = 99.99 var aktifMi bool = true

Struct (Yapılar)

Go dilinde struct, farklı veri tiplerini bir arada tutan özel veri yapılarıdır. Nesne yönelimli programlamadaki class mantığına benzer.

Örnek:

GO
type Kullanici struct { Ad string Yas int Email string } kullanici := Kullanici{"Deniz", 30, "deniz@example.com"} fmt.Println(kullanici.Isim)

İç içe Struct

Go’da iç içe yapılar oluşturabilirsiniz:

GO
type Adres struct { Sehir string Ulke string } type Kullanici struct { Isim string Yas int Adres Adres } kullanici := Kullanici{"Deniz", 30, Adres{"İstanbul", "Türkiye"}} fmt.Println(kullanici.Adres)

Pointer'lar

Go’da pointer kullanımı, bellekteki bir veriye doğrudan erişim sağlar.

Örnek:

GO
sayi := 42 ptr := &sayi fmt.Println(*ptr) // Değere erişir fmt.Println(ptr) // adresi yazdırır

Diziler, Slice ve Map

Array (Dizi)

Dizi boyutu sabittir:

GO
var rakamlar [3]int = [3]int{1, 2, 3}

Slice

Slice, dinamik boyutludur:

GO
var rakamlar []int rakamlar = append(rakamlar, 4, 5)

Map

Anahtar-değer eşleşmeleri oluşturur:

GO
kullanicilar := map[string]int{"Deniz": 30, "Ali": 25}

Fonksiyonlar

Go’da fonksiyonlar temel yapı taşlarıdır:

GO
func Topla(a int, b int) int { return a + b } sonuc := Topla(3, 4) fmt.Println(sonuc) // 7

Interface

Interface'ler, farklı struct'ların ortak yöntemlerini tanımlar:

GO
type Hayvan interface { SesCikar() string } type Kopek struct{} func (k Kopek) SesCikar() string { return "Hav!" }

Go’da Eşzamanlı Programlama (Concurrency)

Go’nun en güçlü yönlerinden biri eşzamanlı programlama yapabilmesidir. Bu işlemleri Goroutine ve Channel yapıları ile yönetir.

Goroutine

Goroutine'ler hafif thread’ler olarak düşünebiliriz. Kullanımı oldukça kolaydır:

GO
func mesajYaz(mesaj string) { for i := 0; i < 5; i++ { fmt.Println(mesaj, i) } } func main() { go mesajYaz("Merhaba") fmt.Scanln() }

Channel (Kanallar)

Channel, goroutine’ler arasında güvenli veri alışverişi sağlar:

GO
func sayilar(c chan int) { for i := 1; i <= 5; i++ { c <- i } close(c) } func main() { kanal := make(chan int) go func() { kanal <- 10 }() sonuc := <-kanal fmt.Println(sonuc) }

Worker Havuzu (Worker Pool)

Goroutine’leri işçi havuzu gibi kullanarak işleri eşzamanlı yapabiliriz:

GO
func worker(id int, jobs <-chan int, results chan<- int) { for j := range jobs { fmt.Println("İşlem başladı:", j) sonuc := j * 2 results <- sonuc } } func main() { jobs := make(chan int, 100) results := make(chan int, 100) for w := 1; w <= 5; w++ { go worker(jobs, results) } for j := 1; j <= 10; j++ { jobs <- j } close(jobs) for a := 1; a <= 10; a++ { fmt.Println(<-results) } } func worker(jobs <-chan int, results chan<- int) { for n := range jobs { results <- n * n } }

Go’ya Özel Pratikler ve Kullanımlar

  • go fmt: Kod formatlama
  • go mod: Bağımlılık yönetimi
  • defer: Fonksiyon çıkışında çalıştırılacak işlemler

Defer Kullanımı Örneği

GO
func dosyaOku() { dosya, err := os.Open("deneme.txt") if err != nil { panic(err) } defer dosya.Close() // Dosya okuma işlemleri... }

Faydalı Standart Kütüphaneler

  • strings: String işlemleri
  • fmt: Formatlı çıktı
  • io: Giriş çıkış işlemleri
  • net/http: HTTP istemci ve sunucu işlemleri

Örneğin, strings kütüphanesi kullanımı:

GO
import "strings" fmt.Println(strings.ToUpper("golang")) // GOLANG

Sonuç

Go dili, güçlü eşzamanlı işlem özellikleri, temiz söz dizimi ve geniş standart kütüphanesi ile modern programlamanın ihtiyaçlarını karşılayan popüler bir dildir. Bu temel kavramlar ve özel yapılar ile hızlıca Go dilinde projeler geliştirmeye başlayabilirsiniz.

Kolay gelsin!