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.

quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

challenge icon

Görev

Kolay

Paketler içe aktarıldığında init fonksiyonlarının 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ı takip ettiği bir günlükleme (logging) sistemi kuracaksınız.

İki girdi alacaksınız:

  • "package1:message1,package2:message2,package3:message3" formatında 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" formatında ana program operasyonlarını içeren bir dize (örneğin, "start_server,process_requests,shutdown")

Göreviniz şunları yapmaktır:

  1. Bireysel paket tanımlarını elde etmek için ilk girdiyi virgüllere göre ayırarak ayrıştırın
  2. Her paket tanımı için, paket adını ve başlatma mesajını almak üzere iki noktaya göre ayırın
  3. Başlatma mesajlarını takip etmek için initLog adında global bir dilim (slice) oluşturun
  4. Bir paket adı ve mesaj alan, ardından "[INIT] [package_name]: [message]" formatındaki mesajı initLog dilimine ekleyen logInit adında bir fonksiyon oluşturun
  5. Girdide göründükleri sırayla her paket için logInit fonksiyonunu çağırarak paket başlatılmasını simüle edin
  6. Başlatma sırası başlığını görüntüleyin: "=== PACKAGE INITIALIZATION SEQUENCE ==="
  7. initLog dilimindeki her başlatma mesajını 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 operasyonları elde etmek için ikinci girdiyi virgüllere göre ayırarak ayrıştırın
  11. Ana programdaki her operasyon için:
    • Şunu yazdırın: "Executing: [operation]"
    • Günlüğe bir mesaj ekleyin: "[MAIN] Operation: [operation]"
  12. Yürütme ö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 bir girişi (hem başlatma mesajlarını hem de ana operasyonları) yazdırın
  14. Final mesajını görüntüleyin: "Program execution completed - all init functions ran before main"

Girdi dizelerini ayırmak için strings paketini ve formatlı çıktı için fmt paketini kullanın. Bu zorluk, init fonksiyonlarının paket içe aktarımı sırasında nasıl otomatik olarak çalıştığını ve her zaman main fonksiyonundan önce yürütüldüğünü göstererek, onları paket kurulumu ve başlatma görevleri için mükemmel kılar.

Kopya kağıdı

init fonksiyonu, bir paket içe aktarıldığında otomatik olarak çalışan Go'daki özel bir fonksiyondur:

package mypackage

import "fmt"

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

init fonksiyonlarının temel özellikleri:

  • Parametre almaz ve değer döndürmez
  • Paket başlatma sırasında otomatik olarak çalışır
  • main fonksiyonu başlamadan önce yürütülür
  • Başlangıç durumunu ayarlamak ve tek seferlik kurulum görevleri için mükemmeldir
  • Boş tanımlayıcı (blank identifier) içe aktarmalarıyla bile tetiklenir

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