Dokumentasi Go
Referensi Go yang ringkas dan penuh contoh. Baca konsepnya, lihat kodenya, lalu praktikkan di perjalanan Coddy.
Mulai kursusMemulai
- Apa Itu Go?Go (sering disebut Golang) adalah bahasa yang bertipe statis dan dikompilasi, dirancang di Google untuk membangun server dan tool yang cepat dan andal. Halaman ini membahas apa itu Go, untuk apa Go dipakai, dan apa kekurangannya.
- Install GoCara mengunduh dan menginstal Go di Windows, macOS, dan Linux, memeriksa instalasi dengan go version, memahami GOPATH, dan mengatasi error "go: command not found".
- Hello WorldProgram hello world di Go baris demi baris: package main, blok import, func main, dan fmt.Println, ditambah cara menjalankannya dan error kompilasi yang pertama kali ditemui pemula.
- go run dan go buildApa yang dilakukan go run, go build, dan go install, cara Go menamai binary, cara cross-compile dengan GOOS dan GOARCH, serta pemeriksaan go fmt dan go vet yang perlu dijalankan sebelum commit.
- Go ModulesCara kerja Go modules: membuatnya dengan go mod init, memilih module path, menambahkan dependensi dengan go get, merapikan dengan go mod tidy, kegunaan go.sum, dan replace untuk pengembangan lokal.
- Package dan ImportCara kerja package di Go: package clause, mengimpor package standar dan package dari module, nama yang di-export dan yang tidak, memecah package ke beberapa file, package internal, alias import, blank import, dan error "undefined" dari go run main.go.
Dasar
- VariabelCara mendeklarasikan variabel di Go dengan var dan bentuk singkat :=, apa itu zero value, assignment ganda, serta error shadowing dan variabel yang tidak dipakai yang sering menjebak programmer Go pemula.
- KonstantaCara kerja const di Go: mendeklarasikan konstanta, perbedaan konstanta bertipe dan tanpa tipe, ekspresi konstanta dengan presisi tak terbatas, dan kenapa Go tidak punya konstanta berupa slice, map, atau struct.
- Enum dan iotaGo tidak punya kata kunci enum. Halaman ini menunjukkan penggantinya yang idiomatis: tipe bernama ditambah blok const dengan iota, serta cara menambahkan String(), validasi, parsing, bit flag, dan dukungan JSON.
- Tipe DataTipe bawaan Go: ukuran dan jangkauan integer, float32 dan float64, bool, string, byte dan rune, bilangan kompleks, zero value, dan cara mencetak tipe sebuah nilai dengan %T.
- Konversi TipeCara mengonversi antartipe di Go: int ke string dan string ke int dengan strconv, float ke int, konversi angka dengan T(v), byte dan rune, jebakan string(65), dan cara menangani error konversi.
- StringBekerja dengan string di Go: package strings (Split, Join, Contains, Replace, Fields, TrimSpace, ToUpper), membangun string secara efisien dengan strings.Builder, raw string multibaris, sifat immutable, dan kenapa len menghitung byte.
- Rune dan ByteArti rune dan byte di Go, cara string menyimpan UTF-8, kenapa len menghitung byte, cara range men-decode rune, konversi antara string, []byte, dan []rune, serta bekerja dengan package bytes.
- fmt.Printf dan SprintfCara package fmt di Go mencetak dan memformat nilai: Println vs Printf vs Sprintf vs Errorf, tabel lengkap format verb (%v, %+v, %d, %s, %q, %f, %T, %w, dan lainnya), width, presisi, dan padding.
Alur Kontrol
- if / elseCara kerja if, else if, dan else di Go: tanpa tanda kurung, kurung kurawal wajib, pernyataan if dengan init statement beserta scope-nya, idiom if err != nil, dan return lebih awal sebagai ganti percabangan bersarang yang dalam.
- Perulangan forGo hanya punya satu kata kunci perulangan, for, dan itu mencakup semuanya: loop counter tiga klausa, loop while yang hanya berisi kondisi, loop tak terbatas, dan range atas slice, map, string, channel, integer, serta fungsi. Ditambah break dan continue berlabel serta perubahan variabel loop di Go 1.22.
- Perulangan whileGo tidak punya kata kunci while. for yang hanya berisi kondisi adalah while loop di Go, for tanpa kondisi adalah perulangan tanpa akhir, dan do-while adalah perulangan tanpa akhir dengan pemeriksaan di bagian akhir.
- Loop rangeApa yang dihasilkan for range untuk slice, array, string, map, channel, integer, dan fungsi iterator, kenapa variabel nilainya adalah salinan, apa yang terjadi saat kamu mengubah slice atau map selama range, dan range over func di Go 1.23.
- Pernyataan switchCara kerja switch di Go: case tidak berlanjut ke case berikutnya secara default, satu case bisa berisi beberapa nilai, switch tanpa kondisi menggantikan rangkaian if/else, switch dengan pernyataan init, kata kunci fallthrough, dan sekilas tentang type switch.
- Operator TernaryGo tidak punya operator ternary (cond ? a : b). Halaman ini menjelaskan alasannya, menunjukkan pengganti idiomatis dengan if/else, cmp.Or untuk nilai default, dan fungsi helper generic beserta jebakan yang membuatnya berbeda dari ternary sungguhan.
Fungsi
- FungsiCara mendeklarasikan dan memanggil fungsi di Go: parameter, tipe parameter yang dipakai bersama, nilai kembalian, pass by value, dan fungsi sebagai nilai yang bisa disimpan dan dikirim ke mana-mana.
- Multiple Return ValuesFungsi Go bisa mengembalikan beberapa nilai sekaligus. Halaman ini membahas sintaksnya, konvensi (value, error), idiom comma-ok, named result, naked return, dan blank identifier.
- Fungsi VariadicFungsi variadic di Go menerima argumen di bagian akhir dengan jumlah berapa pun, dari satu tipe yang sama. Pelajari sintaks ...T, cara mengirim slice dengan s..., jebakan slice yang dipakai bersama, dan cara fmt.Println memakai ...any.
- ClosureFungsi anonim di Go bisa menangkap variabel dari scope di sekitarnya. Dari situ lahir closure: counter, generator, middleware, dan callback yang menyimpan state-nya sendiri.
- Pernyataan deferdefer menjadwalkan sebuah pemanggilan untuk dijalankan saat fungsi di sekitarnya selesai. Pelajari urutan LIFO, kapan argumen dievaluasi, menutup file dan membuka kunci mutex, defer di dalam loop, dan mengubah hasil bernama.
- MethodMethod adalah fungsi yang punya receiver. Pelajari cara mendeklarasikan method, kapan memakai value receiver atau pointer receiver, method set dan interface, serta method pada tipe yang bukan struct.
Koleksi
- ArrayArray di Go punya panjang tetap yang menjadi bagian dari tipenya, dan array disalin saat di-assign. Pelajari cara mendeklarasikan, menelusuri, membandingkan, dan mengirim array, serta kenapa kebanyakan kode Go memakai slice.
- SliceSlice adalah tipe list sehari-hari di Go. Pelajari make, append dan pertumbuhannya, len vs cap, bagaimana slicing berbagi backing array (dan bug yang ditimbulkannya), copy, package slices, slice 2D, serta nil vs kosong.
- MapMap di Go menyimpan pasangan key-value dengan pencarian yang cepat. Pelajari cara membuatnya, memeriksa apakah sebuah key ada dengan comma-ok, menghapus, melakukan iterasi (dalam urutan acak), mengurutkan key, menyimpan struct, dan menghindari panic karena map nil dan penulisan concurrent.
- SetGo tidak punya tipe set bawaan. Idiom standarnya adalah map dengan nilai berupa struct kosong. Pelajari add, has, dan remove, union, intersection, dan difference, serta cara menulis Set generic yang kecil.
- PengurutanUrutkan slice di Go dengan slices.Sort dan slices.SortFunc, urutkan struct berdasarkan satu atau beberapa field dengan cmp.Compare, pertahankan urutan elemen yang sama dengan stable sort, dan pahami kode lama yang memakai sort.Slice.
Struct, Interface, dan Generic
- StructStruct mengelompokkan field bernama menjadi satu tipe. Pelajari cara mendefinisikan dan menginisialisasinya, zero value, pointer ke struct, anonymous struct, perbandingan, struct tag, dan konvensi constructor NewX.
- PointerPointer menyimpan alamat sebuah nilai. Pelajari & dan *, new, pointer ke struct, kenapa aman mengembalikan pointer ke variabel lokal, kapan memakai pointer, dan panic nil pointer dereference.
- InterfaceInterface di Go dipenuhi secara implisit: tipe apa pun yang punya method yang tepat otomatis mengimplementasikannya. Pelajari interface kecil seperti io.Reader dan fmt.Stringer, interface kosong any, jebakan interface nil, dan prinsip accept interfaces, return structs.
- Struct EmbeddingEmbedding menaruh satu tipe di dalam tipe lain tanpa nama field, sehingga field dan method-nya dipromosikan ke tipe luar. Pelajari cara kerja promosi, embedding interface, konflik nama, dan kenapa embedding bukan inheritance.
- Type AssertionType assertion mengambil nilai konkret dari sebuah interface. Pelajari x.(T), bentuk comma-ok yang tidak pernah panic, assertion ke interface lain, type switch, dan errors.As untuk error yang dibungkus.
- GenericGeneric (Go 1.18+) memungkinkan satu fungsi atau tipe bekerja dengan banyak tipe sambil tetap type-safe. Pelajari type parameter, constraint any, comparable, dan cmp.Ordered, constraint kustom dengan ~, tipe generic, dan kapan sebaiknya tidak memakainya.
Error
- Penanganan ErrorGo menangani error sebagai nilai biasa yang dikembalikan oleh fungsi. Pelajari interface error, if err != nil, errors.New dan fmt.Errorf, mengembalikan error dengan konteks, memeriksanya dengan errors.Is dan errors.As, dan menangani setiap error sekali saja.
- Error KustomDefinisikan sentinel error dan tipe error kustom, bungkus error dengan %w, periksa dengan errors.Is dan errors.As, gabungkan beberapa error dengan errors.Join, dan tulis method Unwrap dan Is saat kamu membutuhkannya.
- panic dan recoverPanic menghentikan eksekusi normal dan membongkar stack sambil menjalankan pemanggilan yang di-defer. Pelajari apa penyebab panic, bagaimana recover di fungsi yang di-defer menghentikannya, pesan runtime error yang akan kamu lihat, dan kapan panic adalah pilihan yang tepat.
Konkurensi
- GoroutineCara menjalankan fungsi secara konkuren dengan kata kunci go, menunggu sampai selesai, mendapatkan hasilnya kembali, dan menghindari data race, kebocoran, serta crash yang mudah terjadi dengan goroutine.
- ChannelCara channel di Go mengirim nilai antar goroutine: channel unbuffered dan buffered, menutup channel dan range, tipe arah, error deadlock, dan pipeline yang dibangun dari channel.
- Pernyataan selectCara select menunggu beberapa operasi channel sekaligus: memilih di antara case yang siap, send dan receive non-blocking dengan default, timeout dengan time.After, dan menghentikan perulangan dengan quit channel atau context.
- WaitGroupCara sync.WaitGroup menunggu sekumpulan goroutine selesai: aturan Add, Done, dan Wait, kenapa harus dikirim sebagai pointer, cara mengumpulkan hasil dan error, serta worker pool yang dibangun di atasnya.
- MutexCara melindungi state bersama antar goroutine dengan sync.Mutex dan sync.RWMutex, kapan sync/atomic sudah cukup, cara sync.Once menjalankan setup tepat satu kali, dan kesalahan penguncian yang menyebabkan deadlock.
- Package contextCara context.Context membawa pembatalan, deadline, dan nilai yang terkait request di seluruh program Go: Background, WithCancel, WithTimeout, WithValue, ctx.Done di dalam select, serta context di server dan client HTTP.
Pustaka Standar
- Package timeCara bekerja dengan tanggal dan waktu di Go: time.Now dan time.Sleep, aritmetika Duration, layout acuan 2006-01-02 15:04:05 untuk Format dan Parse, zona waktu, timestamp Unix, serta timer dan ticker.
- JSONCara meng-encode dan men-decode JSON di Go dengan encoding/json: Marshal dan Unmarshal, struct tag seperti omitempty dan omitzero, pretty print, decode ke map[string]any, menolak field yang tidak dikenal, dan streaming dengan Decoder.
- Membaca dan Menulis FileCara membaca dan menulis file di Go: os.ReadFile dan os.WriteFile, membaca baris demi baris dengan bufio.Scanner, menambahkan isi dengan os.OpenFile, memeriksa apakah file ada, dan bekerja dengan direktori.
- HTTP ServerCara membuat web server dengan package standar net/http di Go: handler, routing ServeMux dengan method dan wildcard path (Go 1.22), response JSON, kode status, middleware, timeout, dan graceful shutdown.
- HTTP ClientCara mengirim HTTP request di Go dengan net/http: http.Get, membaca dan menutup body, memeriksa kode status, timeout di http.Client, request dengan context dan header, query parameter, dan mengirim JSON lewat POST.
- Argumen Command LineCara program Go membaca command line-nya: os.Args, package flag untuk opsi bertipe, subcommand dengan FlagSet, environment variable dengan os.Getenv dan os.LookupEnv, serta exit code dengan os.Exit.
- Regular ExpressionCara memakai regular expression di Go dengan package regexp: MustCompile, MatchString, FindString dan FindAllString, capture group dan named group, ReplaceAllString, serta batasan sintaks RE2 seperti tidak adanya lookbehind.
- LoggingCara melakukan logging di Go: package log klasik dengan flag-nya dan log.Fatal, serta log/slog (Go 1.21) untuk log terstruktur dengan level, atribut key-value, handler teks dan JSON, dan logger yang membawa konteks lewat With.
Pengujian dan Struktur Proyek
- TestingCara menguji kode Go dengan package testing standar dan go test: file _test.go, fungsi TestXxx, t.Errorf dibandingkan t.Fatalf, table-driven test dengan t.Run, helper dan direktori sementara, coverage, benchmark dengan b.Loop, dan example test.
- Struktur ProyekCara menyusun proyek Go: mulai dengan struktur datar, pecah menjadi package saat ada alasannya, pakai cmd/ untuk banyak binary dan internal/ untuk kode yang tidak boleh diimpor pihak lain, beri nama package dengan baik, dan simpan test di sebelah kodenya.