BAB 3: Membangun Project Pertama dengan Go Modules
Pelajari cara menginisialisasi project Go dengan Go Modules, memahami struktur go.mod, dan menyiapkan fondasi yang tepat sebelum menulis kode.
Di bab sebelumnya kamu sudah menjalankan program Go pertama — hanya sebuah file tunggal, dijalankan langsung, selesai. Tapi cara itu hanya cocok untuk eksperimen kecil. Begitu project mulai tumbuh, kamu butuh cara untuk mengorganisir kode, mencatat versi dependensi, dan memastikan project bisa berjalan identik di komputer siapa pun. Di sinilah Go Modules masuk.
Go Modules bukan fitur opsional — sejak Go 1.16, ini adalah cara standar untuk membangun project Go. Setiap project yang kamu buat ke depannya akan dimulai dengan langkah yang sama: go mod init.
Kenapa Go Modules Ada
Sebelum Go Modules hadir di versi 1.11, developer Go harus meletakkan semua kode di dalam direktori khusus bernama GOPATH. Artinya tidak peduli project apa yang kamu kerjakan, semua harus berada di satu lokasi terpusat di komputer — tidak praktis, dan menyulitkan kerja tim.
Go Modules mengubah model itu sepenuhnya. Project kini bisa berada di direktori mana saja. Kamu bisa punya puluhan project di tempat berbeda tanpa konflik. Dan yang lebih penting, setiap project membawa catatannya sendiri: versi Go yang digunakan, library apa saja yang dibutuhkan, dan dari mana mengambilnya.
Catatan itu disimpan dalam dua file: go.mod dan go.sum.
Struktur go.mod
File go.mod adalah identitas project kamu. Ketika kamu menginisialisasi module baru, Go membuat file ini dengan dua baris:
module nama-project
go 1.24
Baris module mendefinisikan module path — nama unik yang mengidentifikasi project ini. Untuk project lokal dan belajar, nama sederhana sudah cukup. Tapi kalau kamu berencana mempublikasikan project atau membaginya sebagai library, konvensi yang digunakan adalah format repository path:
module github.com/username/nama-project
Format ini bukan sekadar konvensi estetika. Go menggunakan module path untuk mengetahui dari mana mengambil library ketika orang lain ingin menggunakannya sebagai dependensi.
Baris go menentukan versi minimum Go yang dibutuhkan project ini. Ini penting untuk memastikan fitur bahasa yang kamu gunakan tersedia di versi Go yang dijalankan orang lain.
Seiring project berkembang dan kamu menambahkan library eksternal, go.mod akan tumbuh dengan direktif require:
module hello-go
go 1.24
require (
github.com/some/library v1.2.3
)
Go mengelola baris-baris ini secara otomatis — kamu tidak perlu mengeditnya manual.
File go.sum: Sidik Jari Dependensi
Berpasangan dengan go.mod, ada file go.sum yang akan muncul begitu kamu menambahkan dependensi pertama. File ini berisi checksum kriptografis dari setiap library yang digunakan.
Fungsinya sederhana tapi krusial: memastikan library yang diunduh di komputer kamu identik dengan yang diunduh rekan tim kamu. Tidak ada cara library berubah secara diam-diam tanpa diketahui.
Jangan pernah edit go.sum secara manual. Biarkan Go yang mengelolanya.
Inisialisasi Project Pertama
Saatnya praktek. Buat direktori baru untuk project, lalu inisialisasi module-nya:
mkdir hello-go
cd hello-go
go mod init hello-go
Go akan membuat file go.mod di dalam direktori tersebut:
module hello-go
go 1.24
Dua baris — itu saja yang kamu butuhkan untuk memulai. Project ini sekarang adalah sebuah Go module yang sah.
Membuat File Kode Pertama
Di dalam direktori hello-go, buat file main.go:
// main.go
package main
import "fmt"
func main() {
fmt.Println("Hello, Go!")
}
Jalankan dengan:
go run main.go
Hello, Go!
Kamu sudah punya program Go yang berjalan di dalam sebuah module. Ini adalah titik awal yang akan terus berkembang di bab-bab berikutnya.
Perintah-Perintah Penting
go mod tidy
Setiap kali kamu menambah atau menghapus import di kode, jalankan:
go mod tidy
Perintah ini memastikan go.mod selalu sinkron dengan kode kamu — menambahkan dependensi yang kurang, menghapus yang tidak lagi dipakai, dan memperbarui go.sum. Biasakan menjalankan ini sebelum commit ke version control.
go get
Untuk menambahkan library eksternal:
go get github.com/some/library@v1.2.3
Go akan mengunduh library tersebut, menambahkannya ke go.mod, dan memperbarui go.sum. Tanpa argumen versi, Go mengambil versi terbaru yang tersedia.
go build
Mengompilasi project menjadi binary yang bisa dijalankan langsung:
go build -o hello main.go
./hello
Berbeda dengan go run yang mengompilasi dan langsung menjalankan, go build menghasilkan file executable. Ini yang akan kamu gunakan ketika mendistribusikan program.
Struktur Project yang Akan Tumbuh
Untuk project kecil seperti yang sedang kita bangun, satu file main.go sudah cukup. Tapi seiring project berkembang, ada struktur yang umum digunakan:
hello-go/
├── go.mod
├── go.sum
├── main.go
└── internal/
└── (kode internal yang tidak bisa diimport project lain)
Direktori internal/ adalah konvensi khusus Go — package di dalamnya tidak bisa diimpor dari luar module ini. Ini berguna untuk memisahkan kode internal yang tidak dimaksudkan sebagai API publik.
Kamu tidak perlu memikirkan struktur ini sekarang. Yang penting dipahami adalah bahwa Go Modules memberikan kebebasan untuk mengorganisir kode sesukamu, selama ada file go.mod di root direktori project.
Latihan
-
Buat module baru dengan nama
kalkulator-gomenggunakango mod init. Buatmain.godengan dua pemanggilanfmt.Println— satu mencetak jumlah dua angka, satu lagi hasil perkaliannya. Nilai angkanya hardcode dulu, seperti yang dilakukan di bab sebelumnya. -
Lihat isi
go.modyang dihasilkan. Versi Go apa yang tercatat? Bandingkan dengan outputgo versiondi terminal kamu. -
Coba jalankan
go mod tidydi project kamu. Apa yang terjadi? Periksa apakah ada perubahan digo.mod.
Setelah kode main.go berjalan di dalam module dan kamu memahami peran go.mod, ada satu hal yang belum kita bahas: bagaimana sebenarnya setiap baris kode itu bekerja? Kenapa harus ada package main? Apa yang dilakukan import? Di bab berikutnya kita akan membedah anatomi program Go baris per baris — dan jawaban dari pertanyaan-pertanyaan itu akan membuat semuanya terasa jauh lebih masuk akal.