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:

bash
mkdir /tmp/belajar-go
cd /tmp/belajar-go
go mod init example.com/halo

Output yang Dihasilkan:

text
go: creating new go.mod: module example.com/halo

Pesan tersebut menyatakan bahwa berkas go.mod baru saja dibuat. Selanjutnya kita tambahkan satu program kecil di berkas main.go:

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:

text
belajar-go/
├── go.mod
└── main.go

Program di dalam module dijalankan dengan pola go run . dari folder proyek. Tanda titik berarti “package di direktori saat ini”:

bash
go run .

Output yang Dihasilkan:

text
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:

bash
cat go.mod

Output yang Dihasilkan:

text
module example.com/halo

go 1.27.2

Mari kita telaah kedua baris penting tersebut:

  1. Baris module example.com/halo: menyatakan nama module. Seluruh package di dalam proyek ini diimpor oleh kode lain dengan awalan example.com/halo/....
  2. Baris go 1.27.2: menyatakan versi Go minimum yang dibutuhkan proyek. Perintah go akan 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:

DirektoriPeranSifat
cmd/<nama>/tempat fungsi main setiap program yang bisa dieksekusikonvensi komunitas, bukan syarat
internal/package yang hanya boleh diimpor dari module yang samaditegakkan oleh compiler Go
pkg/package yang boleh diimpor oleh module lainkonvensi 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:

CacheVariabelIsiPerintah membersihkan
Build cacheGOCACHEhasil kompilasi paket agar kompilasi berikutnya cepatgo clean -cache
Module cacheGOMODCACHEsource code modul yang pernah diunduhgo clean -modcache

Lokasi build cache dapat dilihat dengan perintah go env:

bash
go env GOCACHE

Output yang Dihasilkan:

text
/home/z/.cache/go-build

Isi folder tersebut adalah ratusan subdirektori bernama dua digit heksadesimal yang mengelompokkan berkas hasil kompilasi. Berikut cuplikan lima direktori pertama di lingkungan penulisan materi ini:

bash
ls "$(go env GOCACHE)" | head -5

Output yang Dihasilkan:

text
00
01
02
03
04

Kedua 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 #