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 türün işaretçisini döndüren new() adlı yerleşik bir işlev sağlar. Ayrılan bellek, türün sıfır değeriyle 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() işlevi, türü bağımsız değişken olarak alır ve o türün yeni ayrılmış sıfır değerine işaretçi döndürür. Bu, özellikle bir işaretçiye ihtiyaç duyduğunuzda ancak başvurabileceğiniz mevcut bir değişken olmadığında kullanışlıdır.
Yapılarla, new() tüm alanları sıfır değerlerine ayarlanmış bir yapıya işaretçi oluşturur.
type Person struct {
Name string
Age int
}
p := new(Person)
fmt.Println(p.Name) // "" (boş string)
fmt.Println(p.Age) // 0new() ile adres operatörü & arasında ne zaman seçim yapmanız gerektiğini merak edebilirsiniz. Aşağıdaki her iki yaklaşım da eşdeğerdir:
// new() kullanma
p1 := new(Person)
// Literal ile adres operatörü kullanma
p2 := &Person{}&Person{} sözdizimi, alanları aynı anda başlatmanıza olanak tanıdığı için uygulamada 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()'in belleği nasıl ayırdığını ve yapıları sıfır değerleriyle başlattığını gösteren bir yapılandırma yöneticisi oluşturalım. Bu yaklaşımın, yapı değişmez değeriyle adres operatörünü kullanmaktan nasıl farklı olduğunu göreceksin.
Kodunu iki dosyaya ayıracaksın:
config.go:ServerConfig(string),Host(int),Port(int) veMaxConnections(bool) alanlarına sahip birDebugModeyapısı tanımla. İki işlev oluştur:NewServerConfig, birnew()ayırmak içinServerConfigkullanır ve işaretçiyi doğrudan döndürür (tüm sıfır değerleriyle)ConfigureServer, bir*ServerConfigişaretçisiyle birlikte bir host dizesi ve port tam sayısı alır, ardından işaretçi üzerinden bu alanları yapılandırmada ayarlar
Displayüzerinde bir*ServerConfigyöntemi ekle.main.go: Girdiden bir host ve port oku. ÖnceNewServerConfig()kullanarak bir yapılandırma oluştur ve sıfır değerlerini göstermek için görüntüle. Ardından host ve portu ayarlamak içinConfigureServerkullan ve güncellenmiş değerleri göstermek üzere yapılandırmayı tekrar görüntüle.
Aşağıdaki girdiler sağlanacaktır:
- 1. satır: Host adı (string)
- 2. satır: Port numarası (integer)
Display yöntemin tam olarak şu biçimde bir dize döndürmelidir:
Host: [Host]
Port: [Port]
MaxConnections: [MaxConnections]
DebugMode: [DebugMode]Görüntüleme çıktısını iki kez yazdır: 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 şu şekilde olmalıdır:
Host:
Port: 0
MaxConnections: 0
DebugMode: false
Host: localhost
Port: 8080
MaxConnections: 0
DebugMode: falseİlk görüntülemenin tüm sıfır değerlerini (boş dize, 0, 0, false) gösterdiğine dikkat et; bunun nedeni new()'in her şeyi sıfır değerleriyle başlatmasıdır. ConfigureServer çağrıldıktan sonra yalnızca host ve port değişirken diğer alanlar sıfır değerlerinde kalır.
Kendin dene
package main
import (
"fmt"
)
func main() {
// Girişi oku
var host string
var port int
fmt.Scanln(&host)
fmt.Scanln(&port)
// TODO: NewServerConfig() kullanarak bir config oluştur ve görüntüle
// Bu, sıfır değerleri gösterecek
// TODO: host ve port değerlerini ayarlamak için ConfigureServer kullan
// TODO: Güncellenmiş değerleri göstermek için config'i tekrar 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 PoolKendi başına pratik yap: Online Go derleyicisi