Sıfır Değerler ve Varsayılanlar
Coddy'nin GO Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 17 / 107.
Go'da her değişkenin bir sıfır değeri (zero value) vardır; bu, bir değişkeni açıkça başlatmadan tanımladığınızda atanan varsayılan değerdir. Başlatılmamış alanlar otomatik olarak bu varsayılanları aldığı için, sıfır değerlerini anlamak struct'larla çalışırken çok önemlidir.
Her türün kendine özgü bir sıfır değeri vardır:
| Tür | Sıfır Değeri |
|---|---|
| int, float64 | 0 |
| string | "" (boş string) |
| bool | false |
| pointer, slice, map | nil |
Bir struct oluşturduğunuzda, açıkça ayarlamadığınız her alan sıfır değerini (zero value) alır.
type User struct {
Name string
Age int
Active bool
}
func main() {
var u User
fmt.Println(u.Name) // "" (boş dize)
fmt.Println(u.Age) // 0
fmt.Println(u.Active) // false
}Bu durum kısmi başlatma için de geçerlidir. Yalnızca belirttiğiniz alanlar özel değerler alır.
u := User{Name: "Alice"}
fmt.Println(u.Age) // 0
fmt.Println(u.Active) // false
Sıfır değerler (zero values), struct'ları açık bir başlatma işlemi gerektirmeden hemen kullanılabilir hale getirir. Ancak, slice ve map gibi referans türlerine dikkat edin; bunların sıfır değeri nil'dir ve bu türleri başlatmadan kullanmaya çalışmak çalışma zamanı paniklerine (runtime panics) yol açabilir.
Görev
KolayGo'de sıfır değerlerin (zero values) nasıl çalıştığını gösteren bir oyuncu profili sistemi oluşturalım. Bazı alanların açıkça ayarlandığı, diğerlerinin ise varsayılan sıfır değerlerine dayandığı bir oyun profili oluşturacaksınız.
Kodunuzu iki dosya halinde düzenleyeceksiniz:
player.go: Şu alanlara sahip birPlayeryapısı (struct) tanımlayın:Username(string),Level(int),Score(int),IsPremium(bool) veGuildName(string). Ayrıca, oyuncunun tüm bilgilerini gösteren formatlanmış bir dize döndüren birDisplayProfilemetodu oluşturun.main.go: Girişten bir kullanıcı adı okuyun ve yalnızca kısmi başlatma (partial initialization) kullanarak bir Player oluşturun—sadeceUsernamealanını ayarlayın. Ardından, Go'nun ayarlanmamış alanları sıfır değerleriyle nasıl doldurduğunu görmek için tam profili görüntüleyin.
Aşağıdaki giriş sağlanacaktır:
- Satır 1: Oyuncunun kullanıcı adı
DisplayProfile metodunuz tam olarak şu formatta bir dize döndürmelidir:
Username: [Username]
Level: [Level]
Score: [Score]
Premium: [IsPremium]
Guild: [GuildName]Örneğin, kullanıcı adı ShadowKnight ise, çıktınız kullanıcı adıyla birlikte başlatılmamış alanlar için tüm sıfır değerlerini göstermelidir:
Username: ShadowKnight
Level: 0
Score: 0
Premium: false
Guild: Guild alanının iki noktadan sonra hiçbir şey göstermediğine dikkat edin—bu, boş dize (empty string) sıfır değeridir. Bu meydan okuma, açık bir değer sağlamadığınızda Go'nun her türe tam olarak ne atadığını görmenize yardımcı olur.
Kopya kağıdı
Go'da her değişkenin bir sıfır değeri (zero value) vardır — bu, bir değişkeni açıkça başlatmadan bildirdiğinizde atanan varsayılan değerdir.
Her türün kendi sıfır değeri vardır:
| Tür | Sıfır Değeri |
|---|---|
| int, float64 | 0 |
| string | "" (boş dize) |
| bool | false |
| pointer, slice, map | nil |
Bir struct oluşturduğunuzda, açıkça ayarlamadığınız her alan kendi sıfır değerini alır:
type User struct {
Name string
Age int
Active bool
}
func main() {
var u User
fmt.Println(u.Name) // "" (empty string)
fmt.Println(u.Age) // 0
fmt.Println(u.Active) // false
}Kısmi başlatma — yalnızca belirtilen alanlar özel değerler alır:
u := User{Name: "Alice"}
fmt.Println(u.Age) // 0
fmt.Println(u.Active) // falseSıfır değerleri, struct'ları açıkça başlatmaya gerek kalmadan hemen kullanılabilir hale getirir. Slice ve map gibi referans türlerine dikkat edin — bunların sıfır değeri nil'dir ve başlatılmadan kullanılırlarsa çalışma zamanı hatalarına (runtime panics) neden olabilirler.
Kendin dene
package main
import (
"fmt"
)
func main() {
// Kullanıcı adını girdiden oku
var username string
fmt.Scanln(&username)
// TODO: Kısmi başlatma kullanarak bir Player oluştur
// Sadece Username alanını ayarla, diğer alanların sıfır değerlerini kullanmasına izin ver
// TODO: DisplayProfile metodunu kullanarak oyuncunun profilini görüntüle
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1Go OOP Temelleri
Harici DosyalarGo Çalışma Alanı ve ModüllerPaketler ve İçe AktarmalarDışa Aktarılan ve Aktarılmayan İsimlerGo'da OOP'ye GirişSınıf Olarak Struct'larStruct'larda Metot TanımlamaPointer ve Değer AlıcılarStruct BaşlatmaYapıcı FonksiyonlarÖzet - Basit Hesap Makinesi4Arayüzler
Arayüzlere GirişÖrtük UygulamaSözleşme Olarak ArayüzBoş Arayüz (any)Tür OnaylamaTür SeçimiArayüz BileşimiStringer ve Error ArayüzleriÖzet - Şekil Hesaplayıcı7Kapsülleme
Dışa Aktarılan ve Aktarılmayan AlanlarPaket Seviyesinde KapsüllemeGetter ve Setter MetotlarıGo'da Bilgi GizlemeÖzet - Öğrenci Kayıtları10Generics (Go 1.18+)
Generics'e GirişTür ParametreleriTür KısıtlamalarıGeneric Struct'larGeneric Metotlar İçin Geçici ÇözümÖzet - Generic Koleksiyon13Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıAbstract Factory KalıbıObserver KalıbıStrategy Kalıbı2Türler ve Struct'lar: Derinlemesine İnceleme
Temel ve Bileşik TürlerÖzel Tür TanımlamalarıStruct EtiketleriAnonim Struct'larİç İçe Geçmiş Struct'larSıfır Değerler ve VarsayılanlarÖzet - Rehber5Kalıtım Yerine Kompozisyon
Go'da Neden Kalıtım YokStruct Gömme TemelleriMetot YükseltmeBirden Fazla Struct GömmeGömme vs AgregasyonGömülü Metotları GölgelemeÖzet - Çalışan Hiyerarşisi8Hata Yönetimi ve OOP
error ArayüzüÖzel Hata TürleriHata Sarmalama (fmt.Errorf)Sentinel Hatalarerrors.Is() ve errors.As()Panic, Defer ve RecoverÖzet - Dosya Ayrıştırıcı3İşaretçiler ve Bellek
Go'da İşaretçi TemelleriStruct İşaretçileriDeğer ile Geçme ve Referans ile Geçmenew() FonksiyonuGo'da Garbage CollectionÖzet - Linked List Oluşturucu6Go'da Polimorfizm
Interface'ler ile PolimorfizmGo'da Duck TypingInterface Karşılama KurallarıPolimorfik KoleksiyonlarDependency InjectionÖzet - Payment Processor9Eşzamanlılık ve OOP
Goroutine TemelleriKanallar ve İletişimTamponlu ve Tamponsuz KanallarSelect İfadesisync.Mutex ve sync.RWMutexsync.WaitGroupThread-Safe Struct TasarımıÖzet - Worker Pool