Setiap program Go yang serius berdiri di atas sebuah module: kumpulan package yang dibuat, dibuild, dan diberi versi sebagai satu unit. Identitas module ini dicatat dalam satu berkas kecil bernama go.mod di akar direktori proyek. Pada chapter ini kita akan menjalankan go mod init sungguhan, membedah setiap directive di dalam go.mod, memahami perbedaan directive go dengan toolchain, lalu melihat apa yang terjadi ketika go.mod tidak ada.

Menginisialisasi Module dengan go mod init #

Perintah go mod init membuat berkas go.mod di direktori aktif. Argumennya adalah module path — identitas unik module yang nantinya dipakai sebagai awalan import path. Untuk demo lokal, kita pakai domain fiktif contoh.com:

bash
go mod init contoh.com/halo

Output yang Dihasilkan:

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

Perintah tersebut berhasil dieksekusi dan keluar dengan status 0. Sekarang direktori berisi satu berkas baru. Mari kita lihat isinya dengan cat:

bash
cat go.mod

Output yang Dihasilkan:

text
module contoh.com/halo

go 1.27.2

Hanya dua directive pada awalnya — ringkas, tetapi keduanya memikul peran penting yang akan kita bedah satu per satu.

Bedah Directive go.mod #

Directive module menyatakan module path. Seluruh package di dalam direktori module akan diakses dengan path <module-path>/<subdirektori>, sebagaimana sudah kita praktikkan pada chapter Package dan Import . Directive go 1.27.2 menyatakan versi minimum bahasa Go yang dibutuhkan module ini. Tabel berikut merangkum directive yang dapat muncul di go.mod:

DirectiveFungsiContoh
moduleModule path sebagai identitas dan awalan import pathmodule contoh.com/halo
goVersi minimum bahasa Go untuk module inigo 1.27.2
toolchainNama toolchain yang dipilih saat buildtoolchain go1.27.2
requireDaftar dependency beserta versinyarequire github.com/google/uuid v1.6.0
replaceMengganti dependency dengan path lokalreplace contoh.com/util => ../util

Directive toolchain tidak ditulis oleh go mod init; ia muncul otomatis ketika go get menambahkan dependency yang membutuhkan Go lebih baru dari versi lokal. Kombinasi go dan toolchain bekerja sama dengan variabel GOTOOLCHAIN yang defaultnya auto: jika toolchain lokal lebih tua dari kebutuhan, Go mengunduh toolchain yang sesuai secara otomatis.

Menjalankan Program dalam Module #

Bundle chapter ini berisi module lengkap di subdirektori src/ — berisi go.mod dan main.go. Karena module ditentukan oleh keberadaan go.mod, kita menjalankan program dari dalam direktori tersebut:

bash
cd src && go run .

Output yang Dihasilkan:

text
Halo dari module

Tanda titik pada go run . berarti “jalankan package di direktori ini”. Programnya sendiri sederhana:

go
package main

import "fmt"

func main() {
	fmt.Println("Halo dari module")
}

Mari kita telaah isi main.go secara singkat:

  1. Baris 1 (package main): menandakan module ini memiliki package utama yang dapat dieksekusi.
  2. Baris 3 (import "fmt"): mengimpor package cetak dari standard library.
  3. Baris 5-7 (func main): titik masuk program yang mencetak satu baris sapaan.

Perintah go build . pada direktori yang sama menghasilkan berkas biner halo — bernama sama dengan segmen terakhir module path — yang dapat dijalankan tanpa toolchain Go di komputer target.

Memilih Module Path #

Module path sebaiknya dipilih sejak awal karena mengubahnya setelah kode dipublikasikan akan memutus semua import path pemakai. Dua konvensi umum: proyek yang dihosting di GitHub memakai github.com/namauser/namaproject, sedangkan domain perusahaan memakai domain aslinya, misalnya corp.example.com/internal/api. Path contoh.com/... yang kita pakai di tutorial ini adalah domain contoh yang dicadangkan untuk dokumentasi — aman untuk latihan, tetapi jangan dipublikasikan ke module proxy publik.

Module Wajib Ada: Kesalahan Tanpa go.mod #

Apa yang terjadi bila kita menjalankan program di luar module? Compiler Go menolak dengan pesan berikut (dijalankan di direktori sementara tanpa go.mod):

bash
go run .

Output yang Dihasilkan:

text
go: go.mod file not found in current directory or any parent directory; see 'go help modules'

Pesan ini menegaskan bahwa sejak Go 1.16, mode module adalah mode default: seluruh build membutuhkan konteks module, ditemukan dengan menelusuri direktori saat ini ke atas sampai menemukan go.mod.

Setelah go.mod berdiri, pertanyaan berikutnya adalah bagaimana menata isi module agar tetap rapi saat jumlah package dan berkas bertambah — pola cmd/, internal/, dan pkg/ akan kita susun pada chapter Struktur Module .

Referensi #

Berkas Sumber

Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.

src/main.go

Unduh berkas
go
package main

import "fmt"

func main() {
	fmt.Println("Halo dari module")
}