Menu
CoddyTech

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.

challenge icon

Tantangan

Mudah

Mari 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 struct Session dengan field ID (string), Username (string), dan Data (slice berisi string). Buat fungsi NewSession yang menerima ID dan username, mengalokasikan Session baru di heap (dengan mengembalikan pointer), dan menginisialisasi slice Data sebagai kosong. Tambahkan juga method AddData dengan pointer receiver yang menambahkan string ke slice Data milik session, serta method Summary yang 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_dashboard

Inti 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("")
}
quiz iconUji dirimu

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

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Go online