Garbage Collection di Go
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GO di Coddy. Pelajaran 23 dari 107.
Tidak seperti bahasa seperti C atau C++, Go menangani pengelolaan memori secara otomatis melalui pengumpulan sampah (GC). Kamu tidak perlu membebaskan memori secara manual setelah selesai menggunakannya. Runtime Go melacak memori mana yang masih digunakan dan mengambil kembali sisanya.
Saat kamu mengalokasikan memori menggunakan new(), make(), atau dengan membuat variabel, garbage collector Go memantau alokasi tersebut. Setelah suatu nilai tidak lagi dapat dijangkau oleh bagian mana pun dari programmu, GC otomatis membebaskan memori tersebut.
func createPerson() *Person {
p := &Person{Name: "Alice", Age: 30}
return p // p berpindah ke heap, GC akan mengelolanya
}
func main() {
person := createPerson()
fmt.Println(person.Name)
// Saat person tidak lagi digunakan, GC mengambil kembali memori
}Dalam contoh ini, struct Person dialokasikan di heap karena dikembalikan dari fungsi. Compiler Go melakukan analisis escape untuk menentukan apakah variabel dapat tetap berada di stack atau harus dipindahkan ke heap. Garbage collector hanya mengelola memori heap.
Manajemen memori otomatis ini memungkinkan kamu fokus membangun aplikasimu tanpa khawatir tentang kebocoran memori akibat dealokasi yang terlupakan. Namun, memahami bahwa GC ada membantumu menulis kode yang lebih efisien dengan meminimalkan alokasi yang tidak perlu saat performa penting.
Tantangan
MudahMari buat session manager yang menunjukkan cara garbage collector Go menangani memori untuk object yang berpindah ke heap. Kamu akan membuat session yang dialokasikan secara dinamis dan dikembalikan dari fungsi, sehingga GC dapat mengelola siklus hidupnya.
Kamu akan mengatur kodemu di dua file:
session.go: Definisikan structSessiondengan fieldID(string),Username(string), danData(slice berisi string). Buat fungsiNewSessionyang menerima ID dan username, mengalokasikan Session baru di heap (dengan mengembalikan pointer), dan menginisialisasi slice Data sebagai kosong. Tambahkan juga methodAddDatadengan pointer receiver yang menambahkan string ke slice Data milik session, serta methodSummaryyang mengembalikan string berformat yang menampilkan detail session.main.go: Baca informasi session dari input, buat session menggunakan fungsi konstruktor, tambahkan beberapa entri data ke dalamnya, lalu tampilkan ringkasan session. Karena session dibuat di dalam fungsi dan dikembalikan sebagai pointer, session berpindah ke heap, tempat garbage collector akan mengelolanya.
Input berikut akan diberikan:
- Baris 1: ID Session
- Baris 2: Username
- Baris 3: Entri data pertama yang akan ditambahkan
- Baris 4: Entri data kedua yang akan ditambahkan
Method Summary-mu harus mengembalikan string dengan format berikut:
Session [ID] for user [Username]
Data entries: [count]
- [entry1]
- [entry2]Misalnya, jika diberikan sess-001, alice, login, dan view_dashboard, output-mu seharusnya seperti ini:
Session sess-001 for user alice
Data entries: 2
- login
- view_dashboardInti pentingnya adalah fungsi NewSession-mu membuat Session dan mengembalikan pointer kepadanya. Hal ini menyebabkan Session "berpindah" ke heap, bukan tetap berada di stack, sehingga Session memenuhi syarat untuk garbage collection setelah tidak ada referensi yang tersisa. Kodemu tidak perlu membebaskan memori ini secara manual: Go menanganinya secara otomatis.
Coba sendiri
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// Baca ID sesi
sessionID, _ := reader.ReadString('\n')
sessionID = sessionID[:len(sessionID)-1]
// Baca nama pengguna
username, _ := reader.ReadString('\n')
username = username[:len(username)-1]
// Baca entri data pertama
data1, _ := reader.ReadString('\n')
data1 = data1[:len(data1)-1]
// Baca entri data kedua
data2, _ := reader.ReadString('\n')
data2 = data2[:len(data2)-1]
// TODO: Buat sesi baru menggunakan fungsi NewSession
// Sesi akan berpindah ke heap karena kita mengembalikan pointer
// TODO: Tambahkan entri data ke sesi menggunakan method AddData
// TODO: Cetak ringkasan sesi menggunakan method Summary
fmt.Println("")
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP di Go
File EksternalWorkspace Go dan modulePaket dan ImporNama yang Diekspor dan Tidak DieksporPengantar OOP di Gostruct sebagai classMendefinisikan method pada structPointer receiver vs value receiverInisialisasi structFungsi KonstruktorUlasan: Kalkulator Sederhana4Interface
Pengenalan InterfaceImplementasi ImplisitInterface sebagai KontrakInterface Kosong (any)Type AssertionType SwitchKomposisi InterfaceInterface Stringer & ErrorUlasan: Kalkulator Bentuk7Enkapsulasi
Field yang Diekspor vs Tidak DieksporEnkapsulasi Tingkat PackageMethod Getter dan SetterPenyembunyian Informasi di GoRingkasan: Data Siswa10Generics (Go 1.18+)
Pengantar GenericsParameter TipeBatasan TipeStruct GenerikCara Alternatif untuk Method GenerikRingkasan Koleksi Generik2Mendalami Tipe dan Struct
Tipe Dasar dan KompositDefinisi Tipe KustomTag StructStruct AnonimStruct BersarangNilai Nol dan Nilai BawaanRangkuman: Buku Kontak5Komposisi daripada Pewarisan
Mengapa Go Tidak Memiliki PewarisanDasar Penyematan StructPromosi methodMenyematkan Beberapa StructPenyematan vs AgregasiMembayangi method yang DisematkanRangkuman: Hierarki Karyawan8Penanganan Error & OOP
Interface errorTipe Error KustomPembungkusan Error (fmt.Errorf)Error Sentinelerrors.Is() dan errors.As()Panic, Defer, dan RecoverRangkuman: Parser File3Pointer dan Memori
Dasar-Dasar Pointer di GoPointer ke StructPass by Value vs ReferenceFungsi new()Garbage Collection di GoRekap: Pembuat Linked List6Polimorfisme di Go
Polimorfisme melalui InterfaceDuck Typing di GoAturan Pemenuhan InterfaceKoleksi PolimorfikInjeksi DependensiRangkuman: Pemroses Pembayaran9Konkruensi & OOP
Dasar-dasar GoroutineChannel & KomunikasiChannel Ber-buffer vs Tanpa BufferPernyataan selectsync.Mutex & sync.RWMutexsync.WaitGroupDesain Struct yang Aman untuk ThreadRingkasan: Worker PoolLatihan sendiri: Compiler Go online