Tutorial ini memperkenalkan konsep dasar workspace. Dengan workspace, kita dapat memberitahu perintah Go bahwa kita sedang menulis kode untuk beberapa modul secara bersamaan dan dengan mudah membangun dan menjalankan kode dalam modul-modul tersebut.

Dalam tutorial ini kita akan membuat dua buah modul dalam sebuah workspace, melakukan perubahan pada satu modul, dan menggunakan perubahan tersebut dalam modul lainnya.

Note
Untuk tutorial lainnya, lihat Daftar tutorial.

Kebutuhan awal

  • Go 1.18 (atau terbaru) yang telah terpasang. Untuk mendapatkan versi Go yang terbaru silakan unduh di go.dev/dl.

  • Sebuah alat untuk menyunting kode.

  • Sebuah terminal. Go bekerja dengan baik di terminal mana pun di Linux dan Mac, bahkan PowerShell atau cmd pada Windows.

Buat sebuah modul untuk kode Anda

Untuk memulai, buatlah sebuah modul untuk kode yang akan kita tulis nanti.

  1. Bukalah terminal dan pindah ke direktori pengguna Anda,

    Pada Linux or Mac:

    $ cd

    Pada Windows:

    C:\> cd %HOMEPATH%

    Perintah selanjutnya pada tutorial ini akan menggunakan $ sebagai tanda eksekusi pada terminal. Perintah yang anda eksekusi juga akan berjalan di Windows.

  2. Dari terminal, buatlah sebuah direktori untuk kode Anda bernama workspace,

    $ mkdir workspace
    $ cd workspace
  3. Inisiasi modul

    Dalam contoh ini kita buat sebuah modul baru hello yang bergantung pada modul golang.org/x/example.

    Buatlah modul hello:

    $ mkdir hello
    $ cd hello
    $ go mod init example.com/hello
    go: creating new go.mod: module example.com/hello

    Tambahkan dependensi golang.org/x/example dengan menggunakan go get,

    $ go get golang.org/x/example

    Buat hello.go dalam direktori hello dengan isi sebagai berikut:

    package main
    
    import (
    	"fmt"
    
    	"golang.org/x/example/stringutil"
    )
    
    func main() {
    	fmt.Println(stringutil.Reverse("Hello"))
    }

    Kemudian jalankan program hello:

    $ go run example.com/hello
    olleH

Buat workspace

Pada langkan ini, kita akan membuat berkas go.work untuk menentukan ruang kerja untuk modul.

Inisiasi workspace

Dalam direktori workspace, jalankan:

$ go work init ./hello

Perintah go work init memberitahu go untuk membuat berkas go.work untuk ruang kerja yang berisi modul hello.

Bentuk isi dari berkas go.work sebagai berikut:

go 1.18

use ./hello

Berkas go.work memiliki sintaks yang mirip dengan go.mod.

Baris direktif go memberitahu perkakas go versi yang akan digunakan oleh workspace. Mirip dengan direktif go pada berkas go.mod.

Direktif use memberitahu perkakas Go bahwa modul pada direktori hello adalah modul utama saat melakukan pembangunan.

Jadi, setiap sub-direktori dalam workspace, akan dianggap sebagai modul yang aktif.

Jalankan program dari direktori workspace

Dalam direktori workspace, jalankan:

$ go run example.com/hello
olleH

Perintah go run mengikutkan semua modul dalam workspace sebagai modul utama. Hal ini membolehkan kita mengacu paket dalam modul, bahkan di luar modul. Menjalankan perintah go run, di luar modul atau workspace akan mengakibatkan eror karena perintah go tidak tahu modul mana yang akan digunakan.

Selanjutnya, kita akan menambahkan salinan dari modul golang.org/x/example ke dalam workspace. Kemudian kita akan tambahkan fungsi baru ke dalam paket stringutil yang dapat kita gunakan selain Reverse.

Unduh dan ubah modul golang.org/x/example

Pada langkah ini, kita akan mengunduh salinan dari modul golang.org/x/example, menambahkan-nya ke dalam workspace, dan kemudian menambahkan fungsi baru yang digunakan oleh program hello nantinya.

  1. Salin repositori

    Dari dalam direktori workspace, jalankan perintah git untuk menyalin repositori:

    $ git clone https://go.googlesource.com/example
    Cloning into 'example'...
    remote: Total 165 (delta 27), reused 165 (delta 27)
    Receiving objects: 100% (165/165), 434.18 KiB | 1022.00 KiB/s, done.
    Resolving deltas: 100% (27/27), done.
  2. Tambahkan modul tersebut ke workspace

    $ go work use ./example

    Perintah go work use menambahkan modul baru ke dalam berkas go.work. Berkas tersebut akan berisi,

    go 1.18
    
    use (
    	./hello
    	./example
    )

    Ruang kerja (workspace) sekarang berisi modul example.com/hello dan modul golang.org/x/example.

    Hal ini membolehkan kita menambahkan atau mengubah kode dalam modul golang.org/x/example bukan lagi menggunakan versi yang di simpan dalam tembolok yang kita unduh lewat perintah go get.

  3. Tambahkan fungsi baru.

    Dalam langkah ini kita akan menambahkan fungsi baru ke dalam paket golang.org/x/example/stringutil.

    Buat sebuah berkas baru toupper.go dalam direktori workspace/example/stringutil yang berisi sebagai berikut:

    package stringutil
    
    import "unicode"
    
    // ToUpper uppercases all the runes in its argument string.
    func ToUpper(s string) string {
    	r := []rune(s)
    	for i := range r {
    		r[i] = unicode.ToUpper(r[i])
    	}
    	return string(r)
    }
  4. Ubah program hello supaya menggunakan fungsi tersebut.

    Ubah isi dari workspace/hello/hello.go supaya berisi sebagai berikut:

    package main
    
    import (
    	"fmt"
    
    	"golang.org/x/example/stringutil"
    )
    
    func main() {
    	fmt.Println(stringutil.ToUpper("Hello"))
    }

Jalankan kembali kode dalam workspace

Dari dalam direktori workspace, jalankan,

$ go run example.com/hello
HELLO

Perintah Go menemukan modul example.com/hello di dalam direktori hello yang ditentukan oleh berkas go.work, dan dengan cara yang sama menemukan impor golang.org/x/example lewat berkas go.work.

Berkas go.work dapat digunakan sebagai pengganti direktif replace untuk bekerja dengan banyak modul.

Secara dua modul tersebut berada dalam ruang kerja yang sama, akan mudah untuk membuat perubahan pada satu modul dan menggunakan-nya di modul yang lain.

Langkah selanjutnya

Sekarang, untuk merilis modul hello kita harus merilis module golang.org/x/example terlebih dahulu, misalnya v0.1.0. Hal ini biasanya dilakukan dengan membuat tag pada komit tertentu pada modul repositori. Lihat dokumentasi alur kerja rilis modul. Saat modul telah dirilis, kita dapat meningkatkan versi yang dibutuhkan pada dalam hello/go.mod:

cd hello
go get golang.org/x/example@v0.1.0

Dengan cara ini, perintah go dapat menggunakan versi terbaru, yang telah diubah, dari golang.org/x/example di luar workspace.

Pelajari lebih lanjut tentang workspace

Perintah go memiliki beberapa sub-perintah untuk workspace selain go work init:

  • go work use [-r] [dir].

    Tambahkan direktif use ke dalam berkas go.work untuk direktori dir jika ia ada, atau hapus direktif use jika direktori tersebut tidak ada. Opsi -r memeriksa sub-direktori dari dir secara rekursif.

  • go work edit

    Sunting berkas go.work, mirip dengan go mod edit.

  • go work sync

    Sinkronisasi dependensi dari daftar modul dalam workspace ke dalam setiap modul dalam workspace.

Lihat Workspace dalam Referensi Go Modul untuk lebih rinci tentang ruang kerja dan berkas go.work.