Lompati ke konten utama
Modul 9 · Pelajaran 4 dari 544/50 dalam kursus~12 min
Pelajaran modul (4/5)

Pergi modul

Modul Go adalah unit yang dapat diversi dan terdiri dari satu atau lebih paket. Ini adalah dasar dari sistem ketergantungan modern (Go 1.11+): tidak ada lagi GOPATH, tidak ada lagi vendor wajib, ketergantungan eksplisit dan dapat direproduksi.

go.mod: manifes modul

Code
module example.com/myapp

go 1.22

require (
    github.com/google/uuid v1.6.0
    golang.org/x/time     v0.5.0
)

Tiga arahan utama:

  • module <path> — jalur impor modul. Semua paket internal diimpor sebagai example.com/myapp/sub/pkg. Tidak harus URL asli, tetapi untuk dipublikasikan melalui go get harus diselesaikan.
  • go <version> — versi Go minimum yang diperlukan (juga digunakan untuk mengontrol fitur bahasa mana yang diperbolehkan, misalnya range-over-func di 1.23).
  • require — ketergantungan langsung dengan versi persisnya.

Arahan lainnya: replace (menggantikan dep dengan fork atau jalur lokal), exclude, retract.

go.sum: file kunci kriptografi

Di samping go.mod, go.sum berisi hash kriptografi SETIAP versi yang diunduh (termasuk dependensi transitif). Ini menjamin reproduksibilitas: jika seseorang merusak versi yang dipublikasikan, pembangunan akan gagal.

Selalu komit. Ini diperbarui secara otomatis dengan perintah go.

Perintah penting

Bash
go mod init example.com/myapp        # create go.mod
go get github.com/google/uuid        # add the dep at its latest version
go get github.com/google/uuid@v1.5.0 # specific version
go get -u ./...                      # upgrade every dep
go mod tidy                          # remove unused deps, add missing ones
go mod download                      # download everything into the cache
go mod why github.com/x/y            # explain why a dep is included
go mod graph                         # full dependency graph

go mod tidy adalah yang Anda jalankan setelah setiap perubahan impor: ini menjamin bahwa go.mod mencerminkan paket yang sebenarnya digunakan.

Versi Impor Semantik (SIV)

Versi mengikuti SemVer: v1.2.3 = MAJOR.MINOR.PATCH. Bagian yang menarik adalah major v2+:

  • Mayor v0 dan v1 → jalur normal: github.com/foo/bar.
  • Mayor v2 atau lebih baru → jalur termasuk versi mayor: github.com/foo/bar/v2.
Go
import "github.com/foo/bar/v2"

Ini memungkinkan Anda mengimpor v1 dan v2 dari perpustakaan yang sama secara bersamaan (berguna selama migrasi progresif).

Impor jalur dan paket internal

Jika modul Anda adalah example.com/myapp, sub-folder utils/ diimpor sebagai:

Go
import "example.com/myapp/utils"

Jalurnya hanya bergantung pada nama yang dideklarasikan di go.mod, bukan pada lokasi di disk: kode yang sama di folder berbeda tetap berfungsi.

Mode ruang kerja (Mulai 1.18+)

Untuk mengerjakan beberapa modul yang saling mereferensikan secara bersamaan (misalnya perpustakaan dan aplikasi yang menggunakannya):

Bash
go work init ./lib ./app

Ini menciptakan go.work: go build akan menggunakan versi lokal ./lib alih-alih mengunduh versi yang dipublikasikan. Jangan melakukan go.work (ini adalah lingkungan pengembangan).

Latihan

Latihan#go.m9.l4.e1
Upaya: 0Memuat…

Modulnya adalah example.com/myapp dan berisi sub-folder utils. Impor sub-paket di main menggunakan path lengkap.

Memuat editor…
Tunjukkan petunjuk

Jalur impor adalah nama modul (dari go.mod) ditambah jalur relatif folder.

Solusi tersedia setelah 3 upaya

Latihan#go.m9.l4.e2
Upaya: 0Memuat…

Ubah masing-masing impor menjadi grup impor dengan sintaks import ( ... ), yang mengimpor fmt dan os.

Memuat editor…

Solusi tersedia setelah 3 upaya

Quiz#go.m9.l4.e3
Siap

Perintah mana yang menghapus dependensi yang tidak lagi diimpor dari go.mod dan menambahkan dependensi yang hilang?

Go
$ go mod ???
Pilihan jawaban