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
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 sebagaiexample.com/myapp/sub/pkg. Tidak harus URL asli, tetapi untuk dipublikasikan melaluigo getharus 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
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 graphgo 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
v0danv1→ jalur normal:github.com/foo/bar. - Mayor
v2atau lebih baru → jalur termasuk versi mayor:github.com/foo/bar/v2.
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:
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):
go work init ./lib ./appIni 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
Modulnya adalah example.com/myapp dan berisi sub-folder utils. Impor sub-paket di main menggunakan path lengkap.
Tunjukkan petunjuk
Jalur impor adalah nama modul (dari go.mod) ditambah jalur relatif folder.
Solusi tersedia setelah 3 upaya
Ubah masing-masing impor menjadi grup impor dengan sintaks import ( ... ), yang mengimpor fmt dan os.
Solusi tersedia setelah 3 upaya
Perintah mana yang menghapus dependensi yang tidak lagi diimpor dari go.mod dan menambahkan dependensi yang hilang?
$ go mod ???