Menu
Coddy logo textTech

`init` Fonksiyonu

Coddy'nin GO Journey'sinin Mantık ve Akış bölümünün bir parçası. Ders 56 / 68.

init fonksiyonu, Go'da bir paket içe aktarıldığında otomatik olarak çalışan özel bir fonksiyondur. Normal fonksiyonların aksine, init fonksiyonunu doğrudan çağırmazsınız; Go, paket başlatma işlemi sırasında onu sizin yerinize yürütür.

Bir init fonksiyonunu şu şekilde tanımlarsınız:

package mypackage

import "fmt"

func init() {
    fmt.Println("Package mypackage is being initialized!")
}

init fonksiyonunun bazı benzersiz özellikleri vardır: parametre almaz, değer döndürmez ve main fonksiyonu başlamadan önce çalışır. Bu, onu başlangıç durumunu ayarlamak, bileşenleri kaydetmek veya paketinizin ihtiyaç duyduğu tek seferlik kurulum görevlerini gerçekleştirmek için mükemmel kılar.

Bir init fonksiyonu içeren bir paketi içe aktardığınızda, paketin dışa aktarılan fonksiyonlarından hiçbirini kullanmasanız bile etkilerini hemen görürsünüz. Daha önce öğrendiğiniz boş tanımlayıcı (blank identifier) içe aktarma deseninin bu kadar yararlı olmasının nedeni budur; paketin kodunu doğrudan kullanmadan başlatılmasını tetiklemenize olanak tanır.

challenge icon

Görev

Kolay

Paketler içe aktarıldığında init işlevlerinin nasıl otomatik olarak çalıştığını gösteren bir paket başlatma sistemi oluşturun. Farklı paketlerin kendilerini başlattığı ve başlangıç sıralarını izlediği bir günlük sistemi oluşturacaksınız.

İki girdi alacaksınız:

  • "package1:message1,package2:message2,package3:message3" biçiminde paket tanımlarını içeren bir dize (örneğin, "database:Database connection pool initialized,cache:Cache system ready,logger:Logging system started")
  • "operation1,operation2,operation3" biçiminde ana program işlemlerini içeren bir dize (örneğin, "start_server,process_requests,shutdown")

Göreviniz:

  1. Bireysel paket tanımlarını elde etmek için ilk girdiyi virgüllere göre bölümlere ayırın
  2. Her paket tanımı için paket adını ve başlatma iletisini elde etmek üzere iki nokta üst üste karakterlerine göre bölümlere ayırın
  3. Başlatma iletilerini izlemek için initLog adlı global bir dilim oluşturun
  4. Bir paket adı ve ileti alan, ardından biçimlendirilmiş logInit iletisini "[INIT] [package_name]: [message]" dilimine ekleyen initLog adlı bir işlev oluşturun
  5. Girdide göründükleri sırayla her paket için logInit işlevini çağırarak paket başlatmayı simüle edin
  6. Başlatma sırası başlığını görüntüleyin: "=== PACKAGE INITIALIZATION SEQUENCE ==="
  7. initLog dilimindeki her başlatma iletisini yazdırın
  8. Ana program başlığını görüntüleyin: "=== MAIN PROGRAM EXECUTION ==="
  9. Şunu yazdırın: "All packages initialized successfully"
  10. Bireysel işlemleri elde etmek için ikinci girdiyi virgüllere göre bölümlere ayırın
  11. Ana programdaki her işlem için:
    • Şunu yazdırın: "Executing: [operation]"
    • Günlüğe şu iletiyi ekleyin: "[MAIN] Operation: [operation]"
  12. Çalıştırma özetini görüntüleyin:
    • "=== EXECUTION SUMMARY ==="
    • "Packages initialized: [number_of_packages]"
    • "Main operations executed: [number_of_operations]"
    • "Total log entries: [total_number_of_log_entries]"
  13. Tam günlüğü görüntüleyin:
    • "=== COMPLETE EXECUTION LOG ==="
    • Tam günlükteki her girdiyi (hem başlatma iletilerini hem de ana program işlemlerini) yazdırın
  14. Son iletiyi görüntüleyin: "Program execution completed - all init functions ran before main"

Girdi dizelerini bölümlere ayırmak için strings paketini, biçimlendirilmiş çıktı için fmt paketini kullanın. Bu alıştırma, init işlevlerinin paket içe aktarma sırasında otomatik olarak nasıl çalıştığını ve her zaman main işlevinden önce çalıştırıldığını gösterir; bu da onları paket kurulumu ve başlatma görevleri için mükemmel kılar.

Kendin dene

package main

import (
	"bufio"
	"fmt"
	"os"
	"strings"
)

// Başlatma mesajlarını takip etmek için global dilim (slice)
var initLog []string

func main() {
	reader := bufio.NewReader(os.Stdin)

	// Girdiyi oku (bufio boşluk içeren satırları doğru şekilde işler)
	packageDefs, _ := reader.ReadString('\n')
	packageDefs = strings.TrimRight(packageDefs, "\r\n")

	mainOps, _ := reader.ReadString('\n')
	mainOps = strings.TrimRight(mainOps, "\r\n")

	// TODO: Kodunuzu aşağıya yazın
	// 1. Bireysel paket girişlerini almak için packageDefs'i "," karakterine göre ayırın
	// 2. Her giriş için, packageName ve message'ı almak üzere ":" karakterine göre (en fazla 2 parça) ayırın
	// 3. Global initLog dilimine "[INIT] [packageName]: message" ekleyen 
	//    bir logInit(packageName, message string) fonksiyonu oluşturun
	// 4. Başlatma sırası başlığını ve tüm başlatma günlüğü girişlerini görüntüleyin
	// 5. Ana yürütme başlığını görüntüleyin ve mainOps içindeki her işlemi işleyin
	//    - Her işlem için "Executing: <op>" yazdırın
	//    - initLog'a "[MAIN] Operation: <op>" ekleyin
	// 6. Yürütme özetini görüntüleyin (paket sayısı, işlem sayısı, toplam günlük girişi)
	// 7. Tam günlüğü ve final tamamlanma mesajını 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.

Mantık ve Akış bölümündeki tüm dersler

Kendi başına pratik yap: Online Go derleyicisi