Alur kerja Go modern berpusat pada module: sebuah folder berisi source code ditambah satu berkas go.mod yang menyatakan identitas proyek. Konsep ini menggantikan aturan lama yang memaksa seluruh kode hidup di dalam ~/go/src, sehingga sekarang kita bebas menaruh proyek di direktori mana pun yang nyaman. Pada chapter ini kita akan membuat sebuah module kecil dari nol, membaca isi go.mod baris demi baris, lalu memetakan lokasi dua cache yang menyimpan hasil kompilasi dan modul unduhan di luar folder proyek.
Membuat Module Pertama #
Sebuah module dibuat dengan perintah go mod init diikuti nama module, biasanya berbentuk jalur domain seperti example.com/halo. Nama ini menjadi identitas proyek saat diimpor oleh module lain, sekaligus pembeda antar modul secara global. Mari kita praktikkan di sebuah folder baru:
mkdir /tmp/belajar-go
cd /tmp/belajar-go
go mod init example.com/haloOutput yang Dihasilkan:
go: creating new go.mod: module example.com/haloPesan tersebut menyatakan bahwa berkas go.mod baru saja dibuat. Selanjutnya kita tambahkan satu program kecil di berkas main.go:
package main
import "fmt"
func main() {
fmt.Println("Halo dari module!")
}Struktur lengkap proyek kita kini sederhana: dua berkas dalam satu folder, tanpa subdirektori wajib apa pun. Tampilan strukturnya sebagai berikut:
belajar-go/
├── go.mod
└── main.goProgram di dalam module dijalankan dengan pola go run . dari folder proyek. Tanda titik berarti “package di direktori saat ini”:
go run .Output yang Dihasilkan:
Halo dari module!Membaca Isi go.mod #
Berkas go.mod adalah jantung module, dan isinya dapat kita periksa langsung. Hasil berikut diambil dari module belajar-go yang baru saja dibuat:
cat go.modOutput yang Dihasilkan:
module example.com/halo
go 1.27.2Mari kita telaah kedua baris penting tersebut:
- Baris
module example.com/halo: menyatakan nama module. Seluruh package di dalam proyek ini diimpor oleh kode lain dengan awalanexample.com/halo/.... - Baris
go 1.27.2: menyatakan versi Go minimum yang dibutuhkan proyek. Perintahgoakan menolak menjalankan proyek dengan toolchain yang lebih lama dari versi ini, atau mengunduh toolchain yang sesuai secara otomatis.
Ketika proyek mulai memakai modul pihak ketiga, go.mod bertambah baris require untuk setiap dependensi, dan go.sum akan dibuat berisi checksum keamanan. Keduanya dibahas tuntas pada Section Package dan Module.
Subdirektori Konvensional #
Module yang kecil boleh tetap berupa tumpukan berkas di satu folder, tetapi proyek yang tumbuh lazim memakai konvensi direktori tertentu. Tabel berikut merangkum yang paling umum dijumpai:
| Direktori | Peran | Sifat |
|---|---|---|
cmd/<nama>/ | tempat fungsi main setiap program yang bisa dieksekusi | konvensi komunitas, bukan syarat |
internal/ | package yang hanya boleh diimpor dari module yang sama | ditegakkan oleh compiler Go |
pkg/ | package yang boleh diimpor oleh module lain | konvensi lama, kini opsional |
Direktori internal/ memiliki kekuatan nyata: compiler Go menolak kode dari module lain yang mencoba mengimpor package di dalamnya. Konvensi cmd/ membuat setiap program punya titik masuk yang jelas, misalnya cmd/server/main.go untuk aplikasi server dan cmd/cli/main.go untuk aplikasi baris perintah.
Lokasi Cache Build #
Dua cache bekerja di luar folder proyek kita, dan keduanya tidak pernah dikomit ke version control. Tabel berikut memetakan keduanya:
| Cache | Variabel | Isi | Perintah membersihkan |
|---|---|---|---|
| Build cache | GOCACHE | hasil kompilasi paket agar kompilasi berikutnya cepat | go clean -cache |
| Module cache | GOMODCACHE | source code modul yang pernah diunduh | go clean -modcache |
Lokasi build cache dapat dilihat dengan perintah go env:
go env GOCACHEOutput yang Dihasilkan:
/home/z/.cache/go-buildIsi folder tersebut adalah ratusan subdirektori bernama dua digit heksadesimal yang mengelompokkan berkas hasil kompilasi. Berikut cuplikan lima direktori pertama di lingkungan penulisan materi ini:
ls "$(go env GOCACHE)" | head -5Output yang Dihasilkan:
00
01
02
03
04Kedua cache sengaja dipisahkan dari folder proyek agar satu salinan hasil kerja dipakai ulang oleh semua module di komputer. Ukurannya membesar seiring waktu dan hal itu wajar; perintah go clean -cache atau go clean -modcache tersedia ketika kita benar-benar perlu mengosongkan ruang disk.
go.work untuk Banyak Module #
Satu repositori kadang memuat beberapa module yang saling terhubung, misalnya protokol dan implementasinya. Perintah go work init membuat berkas go.work yang mendaftarkan module-module tersebut agar bisa dikembangkan bersamaan dalam satu editor tanpa saling mempublikasikan versi pratinjau. Untuk proyek belajar dengan satu module, berkas go.work tidak diperlukan sama sekali.
Dengan struktur module yang kini kita pahami, kita siap memilih editor yang akan menemani penulisan kode sehari-hari, yang akan kita bandingkan pada chapter Memilih Code Editor .
Referensi #
- Organizing a Go module
— struktur direktori modern, peran
go.mod, dan konvensiinternal/. - The go.work file
— spesifikasi resmi berkas
go.work. - Command go
— dokumentasi perintah
go cleanuntuk mengelola cache.