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:

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

bash
go get github.com/google/[email protected]

Output yang Dihasilkan:

text
go: added github.com/google/uuid v1.6.0

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

text
module contoh.com/apl

go 1.27.2

require github.com/google/uuid v1.6.0 // indirect

Program kemudian berjalan sukses:

bash
go run .

Output yang Dihasilkan:

text
UUID    : 6ba7b810-9dad-11d1-80b4-00c04fd430c8
UUID v5 : cfbff0d1-9375-5685-968c-48ce8b15ae17
UUID v5 : cfbff0d1-9375-5685-968c-48ce8b15ae17

Dua baris UUID v5 identik karena UUID versi 5 diturunkan dari hash nama yang sama. Mari kita telaah baris demi baris program di atas:

  1. Baris 3-7 (blok import): fmt dari standard library, lalu github.com/google/uuid dari pihak ketiga — dua kelompok terpisah sesuai konvensi chapter Package Alias .
  2. Baris 10 (uuid.MustParse): mengurai string UUID tetap; fungsi berprefiks Must memanic bila gagal — cocok untuk data konstan.
  3. 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:

bash
go mod tidy

Perintah ini sukses tanpa keluaran, dan go.mod kini bersih:

text
module contoh.com/apl

go 1.27.2

require github.com/google/uuid v1.6.0

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

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

bash
go mod verify

Output yang Dihasilkan:

text
all modules verified

Menaikkan dan Menurunkan Versi #

Perintah go get juga menjadi gerbang perubahan versi. Menurunkan lalu menaikkan kembali dependency demo menghasilkan keluaran nyata berikut:

bash
go get github.com/google/[email protected]

Output yang Dihasilkan:

text
go: downloading github.com/google/uuid v1.5.0
go: downgraded github.com/google/uuid v1.6.0 => v1.5.0
bash
go get -u github.com/google/uuid

Output yang Dihasilkan:

text
go: upgraded github.com/google/uuid v1.5.0 => v1.6.0

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

bash
go mod vendor
bash
ls vendor/github.com/google

Output yang Dihasilkan:

text
uuid

Sejak 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.

PerintahPeran
go get pkg@versiTambah atau ubah versi dependency
go mod tidySinkronkan go.mod/go.sum dengan import aktual
go mod verifyPeriksa checksum cache terhadap go.sum
go mod downloadIsi cache module tanpa build
go mod vendorSalin 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 #

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"

	"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")))
}