Lewati ke konten utama

Go Remembers: Fundamental Go yang Bisa Dijalankan

Repositori pembelajaran Go dengan registrasi otomatis — setiap file konsep terhubung ke runner contoh terurut via hook init().

5 menit baca·Pemula·Konsep·14 Agu 2026
projectgolearning

Go Remembers: Fundamental Go yang Bisa Dijalankan

Apa yang Dibangun

go-remembers adalah proyek Go kecil yang mengajarkan konsep inti bahasa melalui contoh terisolasi yang bisa dijalankan. Setiap konsep berada di file sendiri (arrays.go, channels.go, pointers.go, dan lainnya). Menjalankan go run . mengeksekusi setiap contoh terdaftar dalam urutan alfabetis dan mencetak output ke terminal.

Repositori ini dibuat pada 2026-08-13 dan berkembang dari array dasar hingga channel, fungsi, dan komunikasi goroutine dalam satu hari commit iteratif.

Masalah

Belajar Go dari potongan kode tersebar membuat sulit mengingat perbedaan slice dan array, kapan menggunakan pointer, atau bagaimana channel mengoordinasikan goroutine. Copy-paste ke main.go untuk setiap eksperimen menimbulkan konflik merge dan menyembunyikan contoh yang tersedia. Repositori pembelajaran membutuhkan dua properti:

  1. Satu perintah menjalankan semuanya — tanpa wiring manual saat menambah file topik baru.
  2. Setiap konsep tetap terisolasi — pembaca bisa membuka satu file dan memahami satu ide.

Mengapa Masalah Ini Sulit

Fungsi init() di Go berjalan sebelum main() tetapi tidak menjamin urutan eksekusi antar file. Pendekatan naif — memanggil fungsi contoh langsung dari main.go — mengharuskan mengedit entry point setiap kali file baru ditambahkan. Untuk repo yang dimaksudkan tumbuh topik demi topik, friksi itu cepat menumpuk.

Model Mental untuk Pemula

Bayangkan repositori sebagai papan plugin:

  • Setiap file .go adalah kartu yang mengajarkan satu konsep.
  • Setiap kartu punya hook init() yang menempelkan dirinya ke registry bersama.
  • main.go hanya menekan tombol power — meminta registry menjalankan setiap kartu dalam urutan nama terurut.

Anda menambah konsep baru dengan membuat file baru; tidak perlu menyentuh main.go lagi.

Persyaratan dan Batasan

PersyaratanCara repo memenuhi
Bisa dijalankan tanpa konfigurasigo run . standar dari root repo
Contoh mudah ditemukanRegistry mengumpulkan semua panggilan registerExample otomatis
Urutan run deterministikNama diurutkan alfabetis sebelum eksekusi
File konsep terisolasiSatu topik per file dengan init() sendiri
Output mudah dibaca pemulafmt.Printf / println di setiap contoh

Ringkasan Arsitektur

Alur Eksekusi

  1. Go mengompilasi semua file dalam package main.
  2. init() setiap file memanggil registerExample(name, fn) dan menyimpan fungsi di exampleRegistry.
  3. main() memanggil runExamples().
  4. runExamples() mengumpulkan semua nama terdaftar, mengurutkannya, lalu memanggil setiap fungsi secara berurutan.
  5. Setiap contoh mencetak output sendiri — array, slice, channel, dan seterusnya.

Komponen Penting

KomponenFileTanggung jawab
Registryexamples.goregisterExample, runExamples, dispatch terurut
Entry pointmain.goHanya memanggil runExamples()
Arraysarrays.goKoleksi ukuran tetap, array struct, array multi-dimensi
Slicesslices.goSlice dinamis, append, slice struct
Mapsmaps.goOperasi key-value dan iterasi
Pointerspointers.goAlamat, dereference, mutasi via pointer
Structsstructs.goTipe kustom dan komposisi
Stringsstringss.goManipulasi string
Channelschannels.goChannel buffered/unbuffered, goroutine, select
Functionsfunctionsgo.goClosure, multi-return, pola higher-order

Contoh Implementasi yang Disederhanakan

Pola registry (disederhanakan dari examples.go):

type exampleFunc func()

var exampleRegistry = make(map[string]exampleFunc)

func registerExample(name string, fn exampleFunc) {
exampleRegistry[name] = fn
}

func runExamples() {
names := make([]string, 0, len(exampleRegistry))
for name := range exampleRegistry {
names = append(names, name)
}
sort.Strings(names)
for _, name := range names {
exampleRegistry[name]()
}
}

Setiap file konsep mendaftarkan diri sendiri:

func init() {
registerExample("channels", channels)
}

func channels() {
ch := make(chan int)
go func() {
for i := 0; i < 5; i++ {
ch <- i
}
close(ch)
}()
for val := range ch {
println("Received value:", val)
}
}

Reliabilitas dan Idempotensi

Ini adalah runner pembelajaran tanpa state — tidak ada database, jaringan, atau state persisten antar run. Menjalankan ulang go run . selalu menghasilkan output sama untuk kode sumber yang sama. Contoh independen; panic di satu file akan menghentikan run (dapat diterima untuk alat pembelajaran lokal).

Mode Kegagalan

KegagalanDeteksiPemulihan
Nama registry duplikatRegistrasi terakhir menimpa yang sebelumnyaGunakan nama unik per file
Contoh panicProses keluar dengan stack tracePerbaiki fungsi contoh
Registrasi init() hilangContoh tidak pernah dijalankanTambahkan registerExample di init()
Siklus importError kompilasiPertahankan semua file di package main

Trade-off dan Alternatif yang Ditolak

KeputusanAlasanAlternatif yang ditolak
Registrasi init()Tanpa manifest pusat; file baru self-discoverDaftar manual di main.go
Sort alfabetisUrutan prediktif di semua mesinUrutan kompilasi file (non-deterministik)
Satu package mainPengalaman go run . paling sederhanaSubpackage per topik (lebih sulit menjalankan semua)
Output berbasis printUmpan balik langsung untuk pembelajarHanya table-driven test (kurang visual)

Pengujian

Repositori tidak menyertakan test suite. Kebenaran diverifikasi dengan menjalankan contoh dan mengamati output tercetak. Setiap file efektif menjadi integration test manual untuk satu fitur bahasa.

Operasi dan Observabilitas

git clone https://github.com/okfriansyah-moh/go-remembers.git
cd go-remembers
go run .

Membutuhkan Go 1.16 atau lebih tinggi. Tanpa variabel lingkungan atau layanan eksternal.

Pelajaran yang Dipetik

  1. Hook init() skalabel untuk repo plugin-style kecil — menambah file sudah cukup; tidak perlu manifest pusat.
  2. Nama terurut mengalahkan urutan kompilasi — pembelajar melihat urutan sama di setiap mesin.
  3. Satu konsep per file menurunkan beban kognitif — pembaca bisa mempelajari channels.go tanpa parsing kode tidak terkait.
  4. Trace print mengajarkan alur kontrol — terutama untuk goroutine dan select channel.

Sumber