new() Fonksiyonu
Coddy'nin GO Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 22 / 107.
Go, bir tür için bellek ayıran ve ona bir işaretçi döndüren new() adında yerleşik bir fonksiyon sunar. Ayrılan bellek, türün sıfır değerine (zero value) başlatılır.
p := new(int) // bir int için bellek ayırır
fmt.Println(*p) // 0 (sıfır değer)
fmt.Println(p) // 0xc000018030 (bellek adresi)new() fonksiyonu, argüman olarak bir tür alır ve o türün yeni ayrılmış sıfır değerine bir işaretçi döndürür. Bu, bir işaretçiye ihtiyaç duyduğunuz ancak referans verecek mevcut bir değişkeniniz olmadığı durumlarda özellikle yararlıdır.
Struct'lar ile new(), tüm alanları sıfır değerlerine ayarlanmış bir struct'a işaret eden bir pointer oluşturur.
type Person struct {
Name string
Age int
}
p := new(Person)
fmt.Println(p.Name) // "" (boş string)
fmt.Println(p.Age) // 0Ne zaman new() kullanacağınızı, ne zaman adres operatörü & kullanacağınızı merak ediyor olabilirsiniz. Aşağıdaki her iki yaklaşım da eşdeğerdir:
// new() kullanımı
p1 := new(Person)
// Literal ile adres operatörü kullanımı
p2 := &Person{}&Person{} sözdizimi, alanları aynı anda başlatmanıza olanak tanıdığı için pratikte daha yaygındır. Özellikle sıfır değerli bir örnek istediğinizde ve açık bellek ayırma semantiğini tercih ettiğinizde new() kullanın.
Görev
Kolaynew() fonksiyonunun belleği nasıl tahsis ettiğini ve struct'ları sıfır değerlerine (zero values) nasıl başlattığını gösteren bir yapılandırma yöneticisi (configuration manager) oluşturalım. Bu yaklaşımın, bir struct literal ile adres operatörü kullanmaktan nasıl farklı olduğunu göreceksiniz.
Kodunuzu iki dosya halinde düzenleyeceksiniz:
config.go:Host(string),Port(int),MaxConnections(int) veDebugMode(bool) alanlarına sahip birServerConfigstruct'ı tanımlayın. İki fonksiyon oluşturun:- Bir
ServerConfigtahsis etmek içinnew()kullanan ve doğrudan işaretçiyi (tüm sıfır değerleriyle birlikte) döndürenNewServerConfig - Bir
*ServerConfigişaretçisi ile birlikte bir host string'i ve port tam sayısı alan, ardından bu alanları işaretçi üzerinden yapılandırmada ayarlayanConfigureServer
*ServerConfigüzerinde, tüm yapılandırma değerlerini gösteren formatlanmış bir string döndüren birDisplaymetodu ekleyin.- Bir
main.go: Girişten bir host ve port okuyun. İlk olarak,NewServerConfig()kullanarak bir yapılandırma oluşturun ve sıfır değerlerini göstermek için bunu görüntüleyin. Ardından host ve portu ayarlamak içinConfigureServerkullanın ve güncellenmiş değerleri göstermek için yapılandırmayı tekrar görüntüleyin.
Aşağıdaki girişler sağlanacaktır:
- Satır 1: Host adı (string)
- Satır 2: Port numarası (integer)
Display metodunuz tam olarak şu formatta bir string döndürmelidir:
Host: [Host]
Port: [Port]
MaxConnections: [MaxConnections]
DebugMode: [DebugMode]Görüntüleme çıktısını iki kez yazdırın; bir kez yapılandırmadan önce (sıfır değerlerini göstererek) ve bir kez yapılandırmadan sonra (güncellenmiş host ve portu göstererek).
Örneğin, localhost ve 8080 verildiğinde, çıktınız şöyle olmalıdır:
Host:
Port: 0
MaxConnections: 0
DebugMode: false
Host: localhost
Port: 8080
MaxConnections: 0
DebugMode: falseİlk görüntünün tüm sıfır değerlerini (boş string, 0, 0, false) nasıl gösterdiğine dikkat edin, çünkü new() her şeyi sıfır değerlerine başlatır. ConfigureServer çağrıldıktan sonra, diğer alanlar sıfır değerlerinde kalırken yalnızca host ve port değişir.
Kopya kağıdı
new() fonksiyonu bir tip için bellek ayırır ve bu tipin sıfır değerine (zero value) başlatılmış bir işaretçisini (pointer) döndürür:
p := new(int) // bir int için bellek ayırır
fmt.Println(*p) // 0 (sıfır değer)
fmt.Println(p) // 0xc000018030 (bellek adresi)Struct'lar ile new(), tüm alanları sıfır değerlerine ayarlanmış bir struct işaretçisi oluşturur:
type Person struct {
Name string
Age int
}
p := new(Person)
fmt.Println(p.Name) // "" (boş dize)
fmt.Println(p.Age) // 0new() kullanımı ile adres operatörü & kullanımı - her ikisi de eşdeğerdir:
// new() kullanarak
p1 := new(Person)
// Literal ile adres operatörünü kullanarak
p2 := &Person{}&Person{} sözdizimi daha yaygındır çünkü oluşturma sırasında alan başlatmaya (initialization) olanak tanır. Açık bellek ayırma semantiği ile sıfır değerli bir örnek (instance) istediğinizde new() kullanın.
Kendin dene
package main
import (
"fmt"
)
func main() {
// Girdiyi oku
var host string
var port int
fmt.Scanln(&host)
fmt.Scanln(&port)
// TODO: NewServerConfig() kullanarak bir yapılandırma oluşturun ve bunu görüntüleyin
// Bu, sıfır değerlerini gösterecektir
// TODO: Ana bilgisayarı ve bağlantı noktasını ayarlamak için ConfigureServer'ı kullanın
// TODO: Güncellenmiş değerleri göstermek için yapılandırmayı tekrar görüntüleyin
}
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