Pendahuluan
Dokumen ini mendemonstrasikan cara membuat sebuah paket Go yang sederhana dalam sebuah modul dan memperkenalkan perkakas go, cara standar untuk mengambil, membuat, dan memasang modul, paket, dan perintah Go.
Catatan: dokumen ini mengasumsikan bahwa Anda menggunakan Go 1.13 atau terbaru dan variabel lingkungan GO111MODULE tidak di-set. Jika Anda mencari versi dokumen pra-modul, bisa dilihat di sini.
Organisasi kode
Program Go disusun menjadi paket-paket. Sebuah paket adalah koleksi dari sumber berkas di dalam direktori yang sama yang dikompilasi bersamaan. Fungsi, tipe, variabel, dan konstanta yang didefinisikan dalam sebuah sumber berkas dapat dilihat dan digunakan oleh sumber berkas lain dalam paket yang sama.
Sebuah repositori berisi satu atau lebih modul.
Sebuah modul adalah koleksi dari paket-paket Go yang berkaitan yang dirilis
secara bersamaan.
Sebuah repositori Go biasanya hanya berisi satu modul.
Sebuah berkas bernama go.mod
di dalam repositori mendeklarasikan path dari
modul: sebuah path impor prefiks untuk semua paket dalam modul.
Modul berisi paket-paket di dalam direktori yang berisi berkas go.mod beserta
sub-direktori di dalamnya.
Ingatlah bahwa Anda tidak perlu menerbitkan kode Anda ke repositori publik sebelum dapat digunakan. Sebuah modul bisa dibuat secara lokal tanpa ada repositori. Namun, akan lebih baik meng-organisir kode Anda supaya suatu saat dapat diterbitkan.
Setiap path dari modul tidak hanya sebagai prefiks dari path impor bagi paket-paket mereka saja, tetapi juga mengindikasikan di mana perintah go harus mencari untuk diunduh. Misalnya, untuk mengunduh "golang.org/x/tools", perintah go akan berkomunikasi dengan repositori yang diindikasikan oleh golang.org/x/tools (dijelaskan lebih lanjut nanti).
Sebuah path impor adalah sebuah string yang digunakan untuk mengimpor sebuah paket. Sebuah path import dari paket yaitu path modul digabung dengan subdirektori di dalam modul tersebut. misalnya, modul github.com/google/go-cmp berisi sebuah paket dalam direktori "cmp/". Path import dari paket tersebut yaitu github.com/google/go-cmp/cmp. Paket-paket dari pustaka standar tidak memiliki prefiks path impor.
Program pertama
Untuk mengompilasi dan menjalankan sebuah program sederhana, pertama pilih
sebuah path untuk paket (kita akan gunakan github.com/user/hello
) dan
buat direktori untuk paket tersebut di dalam ruang-kerja:
$ mkdir $GOPATH/src/github.com/user/hello
Selanjutnya, buat sebuah berkas bernama hello.go
di dalam direktori
tersebut, yang berisi kode Go berikut.
package main import "fmt" func main() { fmt.Println("Hello, world.") }
Sekarang kita bisa membuat dan memasang program tersebut dengan perkakas go
:
$ go install github.com/user/hello
Ingatlah bahwa program tersebut bisa dijalankan di mana pun dalam sistem.
Perkakas go
mencari sumber kode dengan melihat paket github.com/user/hello
di dalam ruang-kerja yang dispesifikasikan oleh GOPATH
.
Kita bisa mengindahkan path paket jika menjalankan go install
dari dalam
direktori paket:
$ cd $GOPATH/src/github.com/user/hello $ go install
Perintah tersebut membangun program hello
, menghasilkan sebuah binari yang
dapat dieksekusi.
Perintah tersebut kemudian memasang binari tersebut ke direktori bin
di
ruang-kerja sebagai hello
(atau, pada Windows, hello.exe
).
Pada contoh ini, binari tersebut akan dibuat di $GOPATH/bin/hello
, atau sama
dengan $HOME/go/bin/hello
.
Perkakas go
akan menampilkan pesan eror bila terjadi kesalahan, jadi bila
tidak ada eror yang ditampilkan, berarti perintah tersebut dieksekusi dengan
sukses.
Anda sekarang dapat menjalankan program tersebut dengan cara:
$ $GOPATH/bin/hello Hello, world.
Atau, bila telah menambahkan $GOPATH/bin
ke dalam PATH
, tinggal mengetikan
nama program:
$ hello Hello, world.
Jika menggunakan sistem source control (misalnya, Git), sekarang adalah saat yang bagus untuk menginisiasi repositori, menambahkan berkas, dan melakukan commit yang pertama. Sekali lagi, langkah ini adalah opsional: tidak perlu menggunakan source control untuk menulis kode Go.
$ cd $GOPATH/src/github.com/user/hello $ git init Initialized empty Git repository in /home/user/go/src/github.com/user/hello/.git/ $ git add hello.go $ git commit -m "commit pertama" [master (root-commit) 0b4507d] initial commit 1 file changed, 1 insertion(+) create mode 100644 hello.go
Memuat kode ke repositori luar sengaja diindahkan sebagai latihan bagi pembaca.
Pustaka pertama
Sekarang mari kita coba membuat sebuah paket pustaka dan menggunakannya dalam
program hello
.
Langkah pertama yaitu memilih path untuk paket pustaka (kita akan gunakan
github.com/user/stringutil
) dan membuat direktori paket:
$ mkdir $GOPATH/src/github.com/user/stringutil
Selanjutnya, buat sebuah berkas dengan nama reverse.go
di dalam direktori
tersebut yang berisi:
// Package stringutil berisi fungsi-fungsi untuk bekerja dengan strings. package stringutil // Reverse mengembalikan sebuah string yang dibalik dari kanan ke kiri. func Reverse(s string) string { r := []rune(s) for i, j := 0, len(r)-1; i < len(r)/2; i, j = i+1, j-1 { r[i], r[j] = r[j], r[i] } return string(r) }
Sekarang, tes apakah paket tersebut dapat di- compile dengan go build
:
$ go build github.com/user/stringutil
Atau, jika sekarang berada dalam direktori sumber paket, tinggal:
$ go build
Perintah tersebut tidak akan membuat berkas apa pun. Namun, ia akan menyimpan paket yang telah terkompilasi di dalam cache internal.
Setelah memastikan paket stringutil
dapat dibangun, ubah hello.go
(yang ada di $GOPATH/src/github.com/user/hello
) untuk menggunakan paket
stringutil
:
package main import ( "fmt" "github.com/user/stringutil" ) func main() { fmt.Println(stringutil.Reverse("!oG ,olleH")) }
Pasang kembali program hello
:
$ go install github.com/user/hello
Jalankan versi terbaru dari program tersebut, akan terlihat pesan yang dibalik:
$ hello Hello, Go!
Setelah mengikuti langkah-langkah di atas, ruang-kerja akan seperti berikut:
bin/ hello # program yang dapat dieksekusi src/ github.com/user/ hello/ hello.go # sumber program stringutil/ reverse.go # sumber paket
Nama paket
Perintah pertama dalam sebuah sumber kode Go haruslah
package name
yang mana name adalah nama untuk paket yang di- import. (Semua berkas di dalam sebuah paket harus menggunakan nama yang sama.)
Konvensi dari Go yaitu nama paket adalah elemen terakhir dari import path:
paket yang diimpor dengan "crypto/rot13"
seharusnya bernama rot13
.
Semua program yang dapat dieksekusi harus menggunakan paket dengan nama
main
.
Tidak ada keharusan bahwa nama paket harus unik di antara semua paket-paket dalam membuat sebuah program, hanya saja nama import path haruslah unik.
Lihatlah dokumen Efektif Go untuk belajar lebih lanjut tentang konvensi penamaan pada Go.
Pengujian
Go memiliki framework (kerangka) pengujian yang ringan, terdiri dari
perintah go test
dan paket testing
.
Pengujian dibuat dalam sebuah berkas yang berakhiran _test.go
yang
berisi fungsi-fungsi bernama TestXXX
dengan format
func TestXxx(t *testing.T)
.
Kerangka tes menjalankan setiap fungsi TestXXX
tersebut;
Jika fungsi tes memanggil sebuah fungsi perintah kesalahan, seperti
t.Error
atau t.Fail
, maka tes dianggap gagal.
Tambahkan sebuah tes ke paket stringutil
dengan membuat berkas
$GOPATH/src/github.com/user/stringutil/reverse_test.go
yang berisi kode Go
berikut.
package stringutil import "testing" func TestReverse(t *testing.T) { cases := []struct { in, want string }{ {"Hello, world", "dlrow ,olleH"}, {"Hello, 世界", "界世 ,olleH"}, {"", ""}, } for _, c := range cases { got := Reverse(c.in) if got != c.want { t.Errorf("Reverse(%q) == %q, want %q", c.in, got, c.want) } } }
Kemudian jalankan tes dengan go test
:
$ go test github.com/user/stringutil ok github.com/user/stringutil 0.165s
Seperti biasa, jika menjalankan perintah go
dari dalam direktori paket,
kita bisa mengindahkan path dari paket:
$ go test ok github.com/user/stringutil 0.165s
Jalankan
go help test
dan lihat
dokumentasi dari paket testing
untuk belajar lebih lanjut.
Paket eksternal
Sebuah import path mendeskripsikan bagaimana mendapatkan sumber kode dari
paket menggunakan sebuah sistem kontrol revisi seperti Git atau Mercurial.
Perkakas go
menggunakan properti ini untuk secara otomatis mengambil paket
dari repositori luar.
Misalnya, contoh-contoh yang diuraikan dalam dokumen ini juga tersimpan di
dalam sebuah repositori Git pada
github.com/golang/example.
Jika mengikutkan URL dari repositori pada import path, go get
akan
mengambil, membuat, dan memasangnya secara otomatis:
$ go get github.com/golang/example/hello $ $GOPATH/bin/hello Hello, Go examples!
Jika paket yang disebutkan tidak ada di dalam ruang-kerja, go get
akan
menyimpannya di dalam ruang-kerja pertama yang diset dalam GOPATH
.
(Jika paket sudah ada, go get
akan melewatkan pengambilan dari luar dan
berjalan seperti halnya go install
.)
Setelah menjalankan perintah go get
di atas, direktori ruang-kerja akan
berbentuk seperti berikut:
bin/ hello # program yang bisa dieksekusi src/ github.com/golang/example/ .git/ # metadata repositori Git hello/ hello.go # sumber program stringutil/ reverse.go # sumber paket reverse_test.go # sumber tes github.com/user/ hello/ hello.go # sumber program stringutil/ reverse.go # sumber paket reverse_test.go # sumber tes
Program hello
yang disimpan di Github bergantung pada paket stringutil
pada repositori yang sama.
Import path di dalam berkas hello.go
menggunakan konvensi yang sama,
sehingga perintah go get
dapat menemukan dan memasang paket dependensi.
import "github.com/golang/example/stringutil"
Konvensi ini adalah cara mudah untuk membuat paket Go yang dapat digunakan oleh orang lain. Halaman Go Wiki dan situs godoc.org menyediakan daftar proyek dan paket eksternal dari Go.
Untuk informasi lebih lanjut tentang menggunakan repositori luar dengan
perkakas go
, lihatlah
go help importpath
.
Selanjutnya
Ikuti Tur Bahasa Go untuk belajar bahasa Go secara daring.