`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.
Görev
KolayPaketler 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:
- Bireysel paket tanımlarını elde etmek için ilk girdiyi virgüllere göre bölümlere ayırın
- 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
- Başlatma iletilerini izlemek için
initLogadlı global bir dilim oluşturun - Bir paket adı ve ileti alan, ardından biçimlendirilmiş
logInitiletisini"[INIT] [package_name]: [message]"dilimine ekleyeninitLogadlı bir işlev oluşturun - Girdide göründükleri sırayla her paket için
logInitişlevini çağırarak paket başlatmayı simüle edin - Başlatma sırası başlığını görüntüleyin:
"=== PACKAGE INITIALIZATION SEQUENCE ===" initLogdilimindeki her başlatma iletisini yazdırın- Ana program başlığını görüntüleyin:
"=== MAIN PROGRAM EXECUTION ===" - Şunu yazdırın:
"All packages initialized successfully" - Bireysel işlemleri elde etmek için ikinci girdiyi virgüllere göre bölümlere ayırın
- Ana programdaki her işlem için:
- Şunu yazdırın:
"Executing: [operation]" - Günlüğe şu iletiyi ekleyin:
"[MAIN] Operation: [operation]" - Ç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]"- 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
- 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
}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
1İleri Seviye Kontrol Akışı
`fallthrough` ile Switchİç İçe Döngülerden ÇıkmaBelirli Bir Döngüye Devam Etme`goto` İfadesiÖzet - İleri Seviye Döngü Kontrolü4Proje: Basit Görev Listesi
Proje KurulumuGörev Ekleme2Structlar ve Metotlar
Structlarda Metot TanımlamaValue Receiver'larPointer Receiver'larReceiver SeçimiMetotlar ve FonksiyonlarÖzet - Struct Davranışı5Derinlemesine Map'ler
Struct Map'leriMap Değeri Olarak Pointer'larNil Map KontrolüMap'leri KarşılaştırmaÖzet - Kelime Frekansı Sayacı3Arayüzler (Temeller)
Arayüz Nedir?Bir Arayüz TanımlamaBir Arayüzü UygulamaArayüz Tiplerini KullanmaBoş ArayüzTip OnaylamalarıTip SeçimiÖzet - Şekiller ve Davranışlar6Deyimsel Go: Kümeler
Go'da Küme DeyimiBir Küme OluşturmaKümeye Eleman EklemeEleman Varlığını Kontrol EtmeKümeden Eleman SilmeKüme Üzerinde YinelemeÖzet - Benzersiz Kullanıcı Adları9Paketler ve Kapsam
Paket Nedir?Dışa Aktarılan ve AktarılmayanlarBasit Bir Paket OluşturmaPaket Takma AdlarıBoş Tanımlayıcı `_``init` FonksiyonuÖzet - Bir Yardımcı Araç OluşturmaKendi başına pratik yap: Online Go derleyicisi