Tidak ada tim yang membangun semuanya dari nol: format UUID, klien database, hingga parser JSON sudah ditulis orang lain dan dikemas sebagai module publik. Pekerjaan kita adalah mengelola kode pihak ketiga tersebut — menambahkannya dengan versi jelas, memperbaruinya, membuang yang tak terpakai, dan memastikan berkas terunduh tidak berubah di tengah jalan. Toolchain Go menyediakan satu suite perintah untuk seluruh siklus itu, dan pada chapter ini kita menjalankan semuanya secara nyata dengan dependency sungguhan: github.com/google/uuid.
Menambah Dependency dengan go get #
Kita mulai dari module kosong. Program main.go memakai dua fasilitas package uuid: MustParse untuk mengurai teks UUID, dan NewSHA1 yang menghasilkan UUID v5 deterministik dari sebuah nama:
package main
import (
"fmt"
"github.com/google/uuid"
)
func main() {
id := uuid.MustParse("6ba7b810-9dad-11d1-80b4-00c04fd430c8")
fmt.Println("UUID :", id)
v5 := uuid.NewSHA1(uuid.NameSpaceDNS, []byte("example.com"))
fmt.Println("UUID v5 :", v5)
fmt.Println("UUID v5 :", uuid.NewSHA1(uuid.NameSpaceDNS, []byte("example.com")))
}Dependency ditambahkan tanpa menyunting go.mod secara manual:
go get github.com/google/[email protected]Output yang Dihasilkan:
go: added github.com/google/uuid v1.6.0Perintah go get mengunduh module dari proxy, menyelesaikan dependensinya, lalu menambahkan baris require ke go.mod. Versi bisa dipilih lewat akhiran @: @v1.6.0 untuk versi pasti, @latest untuk rilis tertinggi, atau @e23f04b untuk commit tertentu. Isi go.mod setelah go get:
module contoh.com/apl
go 1.27.2
require github.com/google/uuid v1.6.0 // indirectProgram kemudian berjalan sukses:
go run .Output yang Dihasilkan:
UUID : 6ba7b810-9dad-11d1-80b4-00c04fd430c8
UUID v5 : cfbff0d1-9375-5685-968c-48ce8b15ae17
UUID v5 : cfbff0d1-9375-5685-968c-48ce8b15ae17Dua baris UUID v5 identik karena UUID versi 5 diturunkan dari hash nama yang sama. Mari kita telaah baris demi baris program di atas:
- Baris 3-7 (blok
import):fmtdari standard library, lalugithub.com/google/uuiddari pihak ketiga — dua kelompok terpisah sesuai konvensi chapter Package Alias . - Baris 10 (
uuid.MustParse): mengurai string UUID tetap; fungsi berprefiksMustmemanic bila gagal — cocok untuk data konstan. - Baris 12-14 (
uuid.NewSHA1): UUID v5 dibangkitkan dari namespace DNS dan nama"example.com"; masukan sama selalu menghasilkan keluaran sama, terbukti dari dua baris identik.
go mod tidy: Membersihkan require #
Anotasi // indirect menandakan module belum tercatat sebagai dependency langsung — sisa kondisi saat go get berjalan sebelum import terbaca. Perintah go mod tidy menyelesaikan dua arah sekaligus: menambah require untuk import yang belum tercantum, dan menghapus yang tidak lagi dipakai:
go mod tidyPerintah ini sukses tanpa keluaran, dan go.mod kini bersih:
module contoh.com/apl
go 1.27.2
require github.com/google/uuid v1.6.0Bila baris import uuid dihapus lalu tidy dijalankan lagi, blok require hilang sama sekali. Kebiasaan menjalankan tidy sebelum commit menjaga go.mod tetap mencerminkan kode yang sesungguhnya.
go.sum: Checksum yang Diverifikasi #
Berikut isi utuh go.sum module demo:
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=Setiap versi dependency mendapat dua baris: hash isi module (h1:) dan hash berkas go.mod-nya (/go.mod). Hash ini dibandingkan setiap build — dependency yang isinya berubah sejak pertama kali diunduh ditolak. Rantai kepercayaannya berlapis: GOPROXY (default proxy.golang.org) menyajikan module, dan GOSUMDB (default sum.golang.org) memverifikasi checksum yang sama tercatat di database checksum publik. Perintah pemeriksaan manualnya:
go mod verifyOutput yang Dihasilkan:
all modules verifiedMenaikkan dan Menurunkan Versi #
Perintah go get juga menjadi gerbang perubahan versi. Menurunkan lalu menaikkan kembali dependency demo menghasilkan keluaran nyata berikut:
go get github.com/google/[email protected]Output yang Dihasilkan:
go: downloading github.com/google/uuid v1.5.0
go: downgraded github.com/google/uuid v1.6.0 => v1.5.0go get -u github.com/google/uuidOutput yang Dihasilkan:
go: upgraded github.com/google/uuid v1.5.0 => v1.6.0Bendera -u (update) menaikkan dependency ke versi minor atau patch terbaru; jalankan go get -u ./... untuk memperbarui seluruh dependency sekaligus. Pembaruan besar tetap mengikuti aturan major dari chapter Versioning Module
: pindah dari v1 ke v2 module uuid kelak bukan sekadar go get — import path berganti menjadi github.com/google/uuid/v2 di seluruh kode.
Vendor: Menyalin Dependency ke Proyek #
Perintah go mod vendor menyalin seluruh source code dependency ke direktori vendor/ dalam proyek:
go mod vendorls vendor/github.com/googleOutput yang Dihasilkan:
uuidSejak vendor/ ada, build otomatis memakai salinan lokal tanpa menghubungi proxy — berkah untuk server build offline atau audit yang mensyaratkan seluruh source code berada dalam repository. Perintah go mod download menempuh jalur lain: mengisi cache module di $GOMODCACHE tanpa mengubah isi proyek.
| Perintah | Peran |
|---|---|
go get pkg@versi | Tambah atau ubah versi dependency |
go mod tidy | Sinkronkan go.mod/go.sum dengan import aktual |
go mod verify | Periksa checksum cache terhadap go.sum |
go mod download | Isi cache module tanpa build |
go mod vendor | Salin dependency ke vendor/ |
Dengan suite ini, proyek kita sudah berdiri lengkap sebagai warga ekosistem Go: kode tertata dalam package, module bernama jelas, rilis berversi, dan dependency terkelola. Fondasi tersebut akan langsung terpakai ketika kita memasuki wilayah yang paling banyak memanfaatkan module pihak ketiga dan standard library sekaligus — dunia tipe data generik pada section Generics .
Referensi #
- Go Modules Reference: go.sum files — format dan semantik checksum.
- Blog: Using Go Modules — alur kerja resmi go get dan tidy.
- Perintah go: Module maintenance — rujukan seluruh subperintah modul.
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
src/main.go
Unduh berkaspackage main
import (
"fmt"
"github.com/google/uuid"
)
func main() {
id := uuid.MustParse("6ba7b810-9dad-11d1-80b4-00c04fd430c8")
fmt.Println("UUID :", id)
v5 := uuid.NewSHA1(uuid.NameSpaceDNS, []byte("example.com"))
fmt.Println("UUID v5 :", v5)
fmt.Println("UUID v5 :", uuid.NewSHA1(uuid.NameSpaceDNS, []byte("example.com")))
}