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

new() 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.

challenge icon

Görev

Kolay

new()'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) ve MaxConnections (bool) alanlarına sahip bir DebugMode yapısı tanımla. İki işlev oluştur:
    • NewServerConfig, bir new() ayırmak için ServerConfig kullanır ve işaretçiyi doğrudan döndürür (tüm sıfır değerleriyle)
    • ConfigureServer, bir *ServerConfig iş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
    Ayrıca tüm yapılandırma değerlerini gösteren biçimlendirilmiş bir dize döndüren, Display üzerinde bir *ServerConfig yöntemi ekle.
  • main.go: Girdiden bir host ve port oku. Önce NewServerConfig() 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çin ConfigureServer kullan 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
}
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

Kendi başına pratik yap: Online Go derleyicisi