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.
Tantangan
MudahBuat 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:
- Urai input pertama dengan memisahkannya berdasarkan koma untuk mendapatkan definisi package satu per satu
- Untuk setiap definisi package, pisahkan berdasarkan titik dua untuk mendapatkan nama package dan pesan inisialisasi
- Buat slice global bernama
initLoguntuk melacak pesan inisialisasi - Buat fungsi bernama
logInityang menerima nama package dan pesan, lalu menambahkan pesan berformat"[INIT] [package_name]: [message]"ke sliceinitLog - Simulasikan inisialisasi package dengan memanggil
logInituntuk setiap package sesuai urutannya dalam input - Tampilkan header urutan inisialisasi:
"=== PACKAGE INITIALIZATION SEQUENCE ===" - Cetak setiap pesan inisialisasi dari slice
initLog - Tampilkan header program utama:
"=== MAIN PROGRAM EXECUTION ===" - Cetak:
"All packages initialized successfully" - Urai input kedua dengan memisahkannya berdasarkan koma untuk mendapatkan operasi satu per satu
- Untuk setiap operasi dalam program utama:
- Cetak:
"Executing: [operation]" - Tambahkan pesan ke log:
"[MAIN] Operation: [operation]" - Tampilkan ringkasan eksekusi:
"=== EXECUTION SUMMARY ===""Packages initialized: [number_of_packages]""Main operations executed: [number_of_operations]""Total log entries: [total_number_of_log_entries]"- Tampilkan log lengkap:
"=== COMPLETE EXECUTION LOG ==="- Cetak setiap entri dari log lengkap, termasuk pesan init dan operasi utama
- 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
}Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Logika & Alur
1Alur Kontrol Lanjutan
switch dengan `fallthrough`Keluar dari Perulangan BersarangMelanjutkan Perulangan TertentuPernyataan `goto`Rangkuman, Kontrol Perulangan Lanjutan4Proyek: Daftar Tugas Sederhana
Menyiapkan ProyekMenambahkan Tugas2Struct dan Method
Mendefinisikan Method pada StructPenerima NilaiPenerima PointerMemilih PenerimaMethod vs FungsiRekap: Perilaku Struct5Map secara Mendalam
Map Berisi StructPointer sebagai Nilai MapMenguji Map NilMembandingkan MapRingkasan: Penghitung Frekuensi Kata8Proyek: Inventaris Sederhana
Gambaran Umum ProyekMemeriksa Stok3Interface (Dasar)
Apa Itu Interface?Mendefinisikan InterfaceMengimplementasikan InterfaceMenggunakan Tipe InterfaceInterface KosongType AssertionType SwitchRingkasan: Bentuk dan Perilaku6Go Idiomatis: set
Idiom set dalam GoMembuat setMenambahkan elemen ke setMemeriksa keanggotaanMenghapus elemen dari setMelakukan perulangan pada setUlasan: Nama pengguna unik9Paket dan Lingkup
Apa Itu Paket?Diekspor vs Tidak DieksporMembuat Paket SederhanaAlias PaketIdentifier Kosong `_`Fungsi `init`Ringkasan: Membuat UtilitasLatihan sendiri: Compiler Go online