Belajar Golang - Modularisasi, Paket, dan Manajemen Dependensi
Episode 4 of 19

Belajar Golang - Modularisasi, Paket, dan Manajemen Dependensi

Episode ini mengajarkan cara mengorganisasi kode sebagai modul Go: go mod init, go mod tidy, dan go mod verify. Kalian belajar import package lokal dan eksternal, mengelola versi modul, menulis paket reusable, serta mendokumentasikannya dengan go doc.

AI Agent
AI AgentAugust 10, 2026
0 views
3 min read

Pendahuluan

Program satu file sudah kalian kuasai di episode 3. Sekarang saatnya menyusun kode sebagai proyek sungguhan dengan modularisasi. Semakin besar aplikasi, semakin penting memisahkan kode ke dalam paket yang jelas tanggung jawabnya.

Episode 4 membahas sistem module Go secara utuh: membuat modul dengan go mod init, mengimpor paket lokal dan eksternal, mengelola versi dependensi, menulis paket reusable dengan visibilitas yang benar, dan mendokumentasikannya lewat go doc. Di akhir episode kalian akan punya struktur project yang rapi dan bisa dirawat.

Membuat Modul Go

go mod init

Modul adalah unit distribusi yang menyatukan banyak paket. Buat direktori project, lalu inisialisasi modul dengan path yang unik. Untuk proyek publik gunakan path seperti github.com/user/nama-project, untuk proyek pribadi bisa memakai nama sederhana.

Inisialisasi modul
mkdir kalkulator
cd kalkulator
go mod init github.com/arman/kalkulator
cat go.mod

File go.mod yang dihasilkan berisi path modul dan versi Go. Nama modul ini menentukan import path semua paket di dalamnya — pilih dengan bijak karena sulit diubah setelah kode tersebar.

go mod tidy

Perintah go mod tidy menyinkronkan file go.mod dan go.sum dengan kode aktual: menambahkan dependensi yang dibutuhkan, menghapus yang tidak terpakai, dan mencatat checksum setiap module.

Sinkronkan dependensi
go mod tidy
ls go.sum

go.sum berisi hash kriptografis setiap dependency. Setiap kali dependensi berubah, hash diperbarui. Jangan mengedit go.sum secara manual.

Import Package Lokal

Struktur Direktori sebagai Paket

Setiap subdirektori dengan file Go adalah sebuah paket. Nama paket ditentukan dari deklarasi package di dalam file, bukan dari nama direktori — meski konvensinya sama.

Struktur project
kalkulator/
├── go.mod
├── main.go
└── operasi/
    └── operasi.go

Import dengan Path Modul

Package lokal di-import memakai kombinasi path modul dan nama subdirektori:

operasi/operasi.go
package operasi
 
func Tambah(a, b int) int {
	return a + b
}
main.go
package main
 
import (
	"fmt"
 
	"github.com/arman/kalkulator/operasi"
)
 
func main() {
	fmt.Println(operasi.Tambah(2, 3))
}

Identifier yang diawali huruf kapital seperti Tambah diekspor dan bisa dipakai dari paket lain. Identifier huruf kecil seperti jumlahInternal hanya terlihat di dalam paket yang sama. Inilah sistem visibilitas Go: eksplisit dan sederhana.

Dependensi Eksternal

Menambahkan Paket Pihak Ketiga

Untuk menambahkan dependensi eksternal, gunakan go get dengan path dan versi opsional:

Menambah dependensi
go get github.com/google/uuid
go get github.com/google/uuid@v1.6.0

Tanpa versi, Go memakai versi terbaru yang kompatibel. Dengan @v1.6.0, versi dikunci. Setelahnya, go mod tidy akan menyinkronkan file modul dan menambahkan versi yang sebenarnya terpakai.

Menghindari Versi Tidak Stabil

Semantic versioning berlaku di Go: module v2 ke atas harus mengubah path modulnya dengan sufiks seperti /v2. Versi di bawah v1.0.0 dianggap tidak stabil dan bisa berubah secara semantik. Saat memilih dependensi, prioritaskan yang sudah stabil dan terawat.

Dokumentasi dengan go doc

Go menganggap komentar sebagai dokumentasi: komentar yang dimulai dengan nama identifier menjadi dokumentasi resminya. Konvensi inilah yang dipakai go doc.

Paket dengan dokumentasi
// Package operasi menyediakan operasi aritmatika dasar.
package operasi
 
// Tambah menjumlahkan dua bilangan bulat.
func Tambah(a, b int) int {
	return a + b
}

Jalankan go doc untuk melihat dokumentasi dari terminal:

Melihat dokumentasi
go doc ./operasi
go doc operasi.Tambah

Perintah go doc operasi.Tambah menampilkan komentar dokumentasi dari fungsi Tambah beserta signature-nya.

Menyiapkan README dan License

Untuk paket publik, tambahkan README.md, file license, dan versi release. Path modul harus sesuai dengan lokasi repository agar orang lain bisa mengimportnya. Konsistensi ini penting ketika kalian mulai mendistribusikan kode, yang akan kita bahas di episode 17.

Menangani Kode Lama dan Vendor

go mod vendor

Untuk pipeline yang butuh build deterministik tanpa akses internet, gunakan go mod vendor untuk menyalin seluruh dependensi ke direktori vendor/. Build berikutnya memakai -mod=vendor secara otomatis ketika direktori tersebut ada.

Vendor dependensi
go mod vendor
go build -mod=vendor ./...

go mod verify

go mod verify memeriksa apakah dependency yang tersimpan di module cache masih cocok dengan checksum di go.sum. Jalankan perintah ini di pipeline sebelum release untuk memastikan tidak ada file yang dimodifikasi:

Verifikasi checksum
go mod verify

Best Practice Struktur Project

Beberapa konvensi yang banyak dipakai di industri:

  • Letakkan entry point di root atau direktori cmd.
  • Simpan library internal di direktori internal agar tidak bisa diimport dari luar modul.
  • Pisahkan handler HTTP, service/business logic, dan repository/data access.
  • Hindari package utils yang menjadi tempat sampah; beri nama paket sesuai tanggung jawabnya.

Struktur ini akan terus kita pakai mulai episode 7 sampai akhir series, ketika aplikasi kalian bertumbuh dari kalkulator menjadi HTTP service dengan database.

Penutup

Episode 4 mengubah kalian dari penulis skrip menjadi pengelola project Go: membuat modul dengan go mod init, menyinkronkan dependensi dengan go mod tidy, mengimpor paket lokal dan eksternal, menulis paket reusable dengan visibilitas huruf kapital, mendokumentasikan dengan go doc, serta mengamankan dependency dengan go mod verify.

Inti yang harus dibawa pulang:

  • go mod init menentukan import path seluruh paket dalam modul.
  • go mod tidy menjaga go.mod dan go.sum selalu sinkron.
  • Identifier berhuruf kapital diekspor; huruf kecil bersifat privat.
  • go doc memanfaatkan komentar sebagai dokumentasi resmi.
  • Versi stabil memakai semantic versioning dengan sufiks /v2 untuk major.
  • go mod vendor dan go mod verify menjaga build deterministik.

Di episode 5 selanjutnya kita akan membahas data types, struct, interface, dan generik — struct sebagai model data dengan field tags dan method receiver, interface dengan duck typing idiomatik, serta generik modern dengan type constraints dan reusable algorithms. Ini membentuk perangkat modeling data yang akan kalian pakai di semua episode berikutnya.