Menu
CoddyTech

Fungsi `init`

Termasuk bagian Logika & Alur dalam perjalanan GO di Coddy. Pelajaran 56 dari 68.

Fungsi init adalah fungsi khusus di Go yang berjalan secara otomatis saat sebuah paket diimpor. Tidak seperti fungsi biasa, kamu tidak memanggil init secara langsung. Go menjalankannya untukmu selama proses inisialisasi paket.

Berikut cara mendefinisikan fungsi init:

package mypackage

import "fmt"

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

Fungsi init memiliki beberapa karakteristik unik: fungsi ini tidak menerima parameter, tidak mengembalikan nilai, dan dijalankan sebelum fungsi main dimulai. Karena itu, fungsi ini cocok untuk menyiapkan keadaan awal, mendaftarkan komponen, atau melakukan tugas penyiapan satu kali yang dibutuhkan package-mu.

Saat kamu mengimpor paket yang berisi fungsi init, kamu akan langsung melihat efeknya, meskipun kamu tidak menggunakan fungsi apa pun yang diekspor oleh paket tersebut. Inilah alasan pola import blank identifier yang kamu pelajari sebelumnya sangat berguna: pola ini memungkinkanmu memicu inisialisasi paket tanpa menggunakan kodenya secara langsung.

challenge icon

Tantangan

Mudah

Buat sistem inisialisasi package yang menunjukkan cara fungsi init dijalankan secara otomatis saat package diimpor. Kamu akan membuat sistem pencatatan tempat berbagai package melakukan inisialisasi sendiri dan melacak urutan startup-nya.

Kamu akan menerima dua input:

  • String yang berisi definisi package dengan format "package1:message1,package2:message2,package3:message3" (misalnya, "database:Database connection pool initialized,cache:Cache system ready,logger:Logging system started")
  • String yang berisi operasi program utama dengan format "operation1,operation2,operation3" (misalnya, "start_server,process_requests,shutdown")

Tugasmu adalah:

  1. Urai input pertama dengan memisahkannya berdasarkan koma untuk mendapatkan definisi package satu per satu
  2. Untuk setiap definisi package, pisahkan berdasarkan titik dua untuk mendapatkan nama package dan pesan inisialisasi
  3. Buat slice global bernama initLog untuk melacak pesan inisialisasi
  4. Buat fungsi bernama logInit yang menerima nama package dan pesan, lalu menambahkan pesan berformat "[INIT] [package_name]: [message]" ke slice initLog
  5. Simulasikan inisialisasi package dengan memanggil logInit untuk setiap package sesuai urutannya dalam input
  6. Tampilkan header urutan inisialisasi: "=== PACKAGE INITIALIZATION SEQUENCE ==="
  7. Cetak setiap pesan inisialisasi dari slice initLog
  8. Tampilkan header program utama: "=== MAIN PROGRAM EXECUTION ==="
  9. Cetak: "All packages initialized successfully"
  10. Urai input kedua dengan memisahkannya berdasarkan koma untuk mendapatkan operasi satu per satu
  11. Untuk setiap operasi dalam program utama:
    • Cetak: "Executing: [operation]"
    • Tambahkan pesan ke log: "[MAIN] Operation: [operation]"
  12. Tampilkan ringkasan eksekusi:
    • "=== EXECUTION SUMMARY ==="
    • "Packages initialized: [number_of_packages]"
    • "Main operations executed: [number_of_operations]"
    • "Total log entries: [total_number_of_log_entries]"
  13. Tampilkan log lengkap:
    • "=== COMPLETE EXECUTION LOG ==="
    • Cetak setiap entri dari log lengkap, termasuk pesan init dan operasi utama
  14. Tampilkan pesan terakhir: "Program execution completed - all init functions ran before main"

Gunakan package strings untuk memisahkan string input dan package fmt untuk menghasilkan output berformat. Tantangan ini menunjukkan cara fungsi init dijalankan secara otomatis selama proses impor package dan selalu dijalankan sebelum fungsi main, sehingga fungsi tersebut cocok untuk tugas penyiapan dan inisialisasi package.

Coba sendiri

package main

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

// Slice global untuk melacak pesan inisialisasi
var initLog []string

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

	// Baca input (bufio menangani baris yang berisi spasi dengan benar)
	packageDefs, _ := reader.ReadString('\n')
	packageDefs = strings.TrimRight(packageDefs, "\r\n")

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

	// TODO: Tulis kodemu di bawah ini
	// 1. Uraikan packageDefs dengan memisahkannya berdasarkan "," untuk mendapatkan setiap entri paket
	// 2. Untuk setiap entri, pisahkan berdasarkan ":" (maksimal 2 bagian) untuk mendapatkan packageName dan message
	// 3. Buat fungsi logInit(packageName, message string) yang menambahkan
	//    "[INIT] [packageName]: message" ke slice global initLog
	// 4. Tampilkan judul urutan inisialisasi dan semua entri log inisialisasi
	// 5. Tampilkan judul eksekusi utama dan proses setiap operasi dari mainOps
	//    - Cetak "Executing: <op>" untuk setiap operasi
	//    - Tambahkan "[MAIN] Operation: <op>" ke initLog
	// 6. Tampilkan ringkasan eksekusi (jumlah paket, jumlah operasi, jumlah seluruh entri log)
	// 7. Tampilkan seluruh log dan pesan akhir bahwa proses telah selesai

}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Logika & Alur

Latihan sendiri: Compiler Go online