Menu
Coddy logo textTech

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)   // 0

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

challenge icon

Görev

Kolay

new() 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) ve DebugMode (bool) alanlarına sahip bir ServerConfig struct'ı tanımlayın. İki fonksiyon oluşturun:
    • Bir ServerConfig tahsis etmek için new() kullanan ve doğrudan işaretçiyi (tüm sıfır değerleriyle birlikte) döndüren NewServerConfig
    • Bir *ServerConfig iş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 ayarlayan ConfigureServer
    Ayrıca *ServerConfig üzerinde, tüm yapılandırma değerlerini gösteren formatlanmış bir string döndüren bir Display metodu ekleyin.
  • 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çin ConfigureServer kullanı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)   // 0

new() 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
}
quiz iconKendini test et

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