Web Artisan
Beranda

Progress belajar

Modul 2 dari 73

0% 0/73 modul selesai

Setelah selesai, tandai modul ini agar progres kursus tetap rapi.

Progress disimpan lokal di browser ini.

Roadmap 1 · Fondasi

Setup Go dan Developer Workflow
untuk Backend Skincare

Di modul ini kita menyiapkan Go 1.26 dan membangun kebiasaan kerja harian yang akan dipakai sepanjang proyek online shop skincare.

Bahasa: Go 1.26~65 menit bacaProyek: Online Shop Skincare
01

Workflow Pertama di Go

Dari instalasi sampai executable lokal

Kalau di Node.js kamu biasa mulai dari npm init, node index.js, lalu menumpuk script di package.json, di Go kamu akan mulai dari go mod init, go run, go test, go fmt, go vet, dan go build.

Tujuan modul ini bukan membuat aplikasi besar dulu. Tujuannya membuat kamu nyaman dengan alat kerja bawaan Go, karena hampir semua proyek Go yang sehat bersandar pada toolchain resmi, bukan tumpukan library tambahan sejak hari pertama.

Di modul sebelumnya kita menyamakan pola pikir. Sekarang kita memasang Go di mesinmu, lalu melatih lingkar kerja yang akan kamu ulang ratusan kali saat membangun katalog, cart, checkout, sampai worker.

🌉Jembatan: dari npm script ke go command

Di ekosistem JS, banyak workflow disusun lewat script custom di package.json yang berbeda tiap tim. Di Go, perintah inti seperti go run, go test, go fmt, go vet, dan go build sudah menjadi kontrak bersama yang sama di semua proyek.

flowchart LR
  A["Install Go"] --> B["go version"]
  B --> C["go mod init"]
  C --> D["Tulis kode Go"]
  D --> E["go fmt ./..."]
  E --> F["go vet ./..."]
  F --> G["go test ./..."]
  G --> H["go run / go build"]
  H --> D

Gambar 1. Setelah setup sekali di kiri, kerja harianmu berputar di lingkar tulis kode → fmt → vet → test → jalankan, lalu kembali menulis kode.

toolchain Go

Kumpulan alat resmi yang datang bersama instalasi Go dalam satu paket: compiler, standard library, formatter, test runner, static analyzer, dan command go sebagai pintu masuknya.

Ringkas

Satu instalasi Go sudah cukup untuk menjalankan, mengetes, memformat, menganalisis, dan membangun binary, tanpa memasang tool terpisah.

Konsisten

gofmt membuat gaya kode seragam di seluruh tim, jadi code review bisa fokus ke desain dan correctness, bukan spasi.

Siap produksi

go build menghasilkan executable untuk service API dan worker yang nanti mudah dikemas ke Docker dan dijalankan di AWS.

02

Install Go dan Verifikasi

Gunakan Go 1.26 untuk jalur ini

Untuk jalur Web Artisan, gunakan Go 1.26 agar go.mod, perintah, dan output kamu konsisten dengan materi dan environment tim.

Sumber resmi yang perlu kamu kenal: Download and install, Go 1.26 Release Notes, How to Write Go Code, Go Modules Reference, Managing Go installations, dan dokumentasi command di cmd/go.

macOS via Homebrew

Terminal
brew update brew install go go version

Windows via winget

PowerShell
winget install GoLang.Go go version

Ubuntu atau Debian via apt

Terminal
sudo apt update sudo apt install golang-go go version
⚠️Catatan penting untuk apt dan paket distro

Repository distro kadang tertinggal beberapa rilis dari versi resmi. Kalau go version tidak menampilkan seri 1.26, pasang lewat installer atau tarball resmi dari go.dev/dl.

Linux manual via tarball resmi

Terminal
# Unduh arsip Linux terbaru dari https://go.dev/dl/ sesuai CPU kamu. # Contoh nama file memakai placeholder 1.26.x, ganti dengan patch terbaru. curl -LO https://go.dev/dl/go1.26.x.linux-amd64.tar.gz sudo rm -rf /usr/local/go sudo tar -C /usr/local -xzf go1.26.x.linux-amd64.tar.gz echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.profile source ~/.profile go version

Output yang kita harapkan mirip seperti ini. Angka patch dan arsitektur bisa berbeda sesuai mesinmu.

Terminal
go version go1.26.0 darwin/arm64
Pastikan go terbaca

Jalankan go version. Kalau command tidak ditemukan, masalahnya hampir selalu PATH yang belum memuat folder binary Go.

Cek lokasi Go aktif

Jalankan which go di macOS/Linux untuk melihat binary go yang sedang dipakai shell, berguna saat ada lebih dari satu instalasi.

Cek environment dasar

Jalankan go env GOROOT GOPATH GOMODCACHE untuk melihat lokasi instalasi, folder kerja, dan cache module toolchain.

Terminal
which go go env GOROOT GOPATH GOMODCACHE

Versi baru tanpa repot: GOTOOLCHAIN

Sejak Go 1.21, toolchain bisa menyesuaikan diri secara otomatis. Kalau go.mod sebuah proyek meminta go 1.26 sedangkan Go di mesinmu masih lebih lama, command go akan mengunduh dan memakai toolchain 1.26 untuk proyek itu, lalu menampilkan pesan bahwa ia berpindah versi.

GOTOOLCHAIN

Pengaturan yang menentukan toolchain mana yang dipakai. Nilai default auto membuat command go otomatis mengunduh toolchain lebih baru saat sebuah proyek memintanya lewat baris go di go.mod.

Terminal
go env GOTOOLCHAIN # auto # Ubah permanen bila perlu, misalnya untuk mengunci di lingkungan tertentu. go env -w GOTOOLCHAIN=auto
🌉Jembatan: dari nvm dan Volta ke GOTOOLCHAIN

Di Node.js kamu sering memakai nvm atau .nvmrc agar versi runtime cocok per proyek. Go menyatukan ide itu ke dalam toolchain: baris go 1.26 di go.mod cukup untuk membuat command go memakai versi yang benar tanpa version manager terpisah.

Editor dan gopls

Bagian dari developer workflow adalah editor yang paham Go. Pasang ekstensi Go resmi (di VS Code) atau plugin Go untuk JetBrains, lalu biarkan ia memakai gopls, language server resmi Go. Dari sini kamu dapat autocomplete, go to definition, error inline sebelum compile, dan format otomatis saat menyimpan file.

🌉Jembatan: dari TypeScript Language Server ke gopls

Pengalaman editor yang kamu nikmati di TypeScript berasal dari language server-nya. Di Go, peran itu dipegang gopls, jadi fitur seperti autocomplete dan rename simbol terasa familier, hanya saja diperkuat compiler yang lebih strict.

💡Best practice tim

Tulis versi Go yang dipakai di go.mod dan dokumentasikan cara install di README. Dengan begitu CI, laptop tiap developer, dan Docker image berangkat dari asumsi versi yang sama.

03

GOPATH vs Go Modules

Kenapa kamu tidak perlu membuat project di ~/go/src lagi

Dulu Go sangat bergantung pada GOPATH, sampai project wajib berada di ~/go/src. Sekarang workflow normal memakai Go Modules, jadi project boleh berada di folder kerja mana pun.

Di ekosistem Node.js, dependency biasanya turun ke node_modules di dalam project. Di Go modern, dependency dan versinya dikunci oleh go.mod, sementara source module yang diunduh disimpan di module cache global, biasanya ~/go/pkg/mod atau nilai dari GOMODCACHE.

flowchart TB
  subgraph old["Dulu: era GOPATH"]
    direction TB
    G1["Semua project wajib di ~/go/src"]
    G1 --> G2["Import dihitung dari posisi folder di GOPATH"]
    G2 --> G3["Pindah folder bisa mematahkan import"]
  end
  subgraph new["Sekarang: era Go Modules"]
    direction TB
    M1["Project bebas di folder kerja mana pun"]
    M1 --> M2["go.mod menetapkan module path dan versi dependency"]
    M2 --> M3["Dependency diunduh ke cache global ~/go/pkg/mod"]
  end

Gambar 2. Pergeseran dari “lokasi folder menentukan identitas” ke “go.mod menentukan identitas”. Inilah alasan tutorial lama yang menyuruhmu pindah ke ~/go/src sudah tidak relevan.

Node.js / PHP
  • node_modules atau vendor/ sering berada di dalam project.
  • package.json berisi identitas project dan dependency.
  • package-lock.json atau composer.lock membantu reproduksi dependency.
Go Modules
  • go.mod berada di root module dan menjadi prefix import path.
  • Dependency diunduh ke module cache global, bukan otomatis ke folder project.
  • go.sum menyimpan checksum untuk memverifikasi dependency yang diunduh.
GOPATH

Folder default Go yang kini berperan sebagai tempat module cache (pkg/mod) dan binary tool (bin), bukan lagi tempat wajib menyimpan source code project modern.

Go Modules

Sistem dependency resmi Go yang membuat project punya go.mod, module path, versi dependency, dan aturan resolusi paket yang konsisten lintas mesin.

Terminal
go env GOPATH # /Users/kamu/go go env GOMODCACHE # /Users/kamu/go/pkg/mod

GOPATH belum benar-benar pensiun

Walau source project tidak lagi tinggal di GOPATH, folder itu masih dipakai untuk dua hal penting: cache module di pkg/mod dan binary CLI tool di bin. Saat nanti kamu memasang tool lewat go install, binarynya mendarat di $GOPATH/bin, jadi pastikan folder itu ada di PATH.

Terminal
# Contoh memasang sebuah CLI tool Go (pola yang akan kamu pakai lagi nanti). go install example.com/some/tool@latest # Binary tool berada di sini, tambahkan ke PATH bila belum terbaca. echo "$(go env GOPATH)/bin"
🌉Jembatan: mirip node_modules, tapi global

Bayangkan ~/go/pkg/mod sebagai cache bersama lintas project, kira-kira seperti cache global npm atau pnpm store. Bedanya, project Go tetap dikendalikan oleh go.mod, bukan oleh isi cache global.

⚠️Jangan commit cache

Jangan commit ~/go/pkg/mod, isi GOMODCACHE, atau build cache. Yang kamu commit adalah source code, go.mod, dan go.sum ketika sudah ada dependency eksternal.

04

go mod init dan Identitas Proyek

Nama module adalah alamat import jangka panjang

Perintah go mod init membuat file go.mod dan menetapkan module path sebagai prefix import untuk semua package di dalam project.

Untuk proyek kita, gunakan module path yang meniru alamat repository Git. Kamu belum harus push ke GitHub hari ini, tetapi memakai pola ini sejak awal membuat import internal rapi saat project membesar.

Terminal
mkdir skincare-backend cd skincare-backend go mod init github.com/kamu/skincare-backend

Output umum:

Terminal
go: creating new go.mod: module github.com/kamu/skincare-backend
go.mod
module github.com/kamu/skincare-backend go 1.26

Baris go 1.26 bukan sekadar catatan. Ia menyatakan versi Go minimum untuk membangun module ini, dan lewat GOTOOLCHAIN tadi, ia ikut menentukan toolchain yang dipakai pada mesin yang versinya lebih lama.

module path

String identitas module di baris pertama go.mod yang sekaligus menjadi prefix import. Package internal/product di module ini diimpor sebagai github.com/kamu/skincare-backend/internal/product.

🌉Jembatan: nama paket npm vs module path Go

Nama paket npm seperti lodash hanyalah label di registry. Module path Go justru menyatu dengan lokasinya: go get github.com/go-chi/chi/v5 benar-benar mengunduh dari alamat itu. Maka pilih module path sesuai tempat repository akan tinggal, bukan nama acak.

Buat folder project

skincare-backend menjadi root module, mirip root project React atau Laravel.

Inisialisasi module

go mod init github.com/kamu/skincare-backend menulis go.mod di root beserta baris versi go.

Commit sejak awal

Commit go.mod agar identitas module tercatat di version control sejak commit pertama.

⚠️Jangan asal ganti module path

Mengganti module path di tengah jalan bisa mematahkan import di banyak file sekaligus. Tentukan nama sedekat mungkin dengan nama repository production agar tidak perlu diubah lagi.

05

go.mod dan go.sum

Mirip package.json + lockfile, tetapi tidak identik

go.mod menjelaskan module dan dependency yang dibutuhkan. go.sum mencatat checksum dependency agar setiap unduhan bisa diverifikasi keasliannya.

Kalau kamu datang dari Node.js, analogi cepatnya: go.mod terasa seperti package.json, sementara go.sum terasa seperti bagian integrity dari lockfile. Tapi hati-hati, go.sum bukan lockfile berisi seluruh pohon dependency seperti package-lock.json.

package.json + lockfile
  • package.json menyimpan metadata dan rentang versi dependency.
  • Lockfile menyimpan pohon dependency yang sangat detail dan rata.
  • Folder node_modules biasanya hidup di project lokal.
go.mod + go.sum
  • go.mod menyimpan module path, versi Go, dan requirement module.
  • go.sum menyimpan hash untuk memverifikasi modul yang pernah diperlukan.
  • Source dependency hidup di module cache global, bukan di project.

Reproduksi build di Go tidak datang dari satu lockfile raksasa, melainkan dari kombinasi go.mod (versi terpilih lewat algoritma minimal version selection) plus go.sum (jaminan isi modul tidak berubah). Hasilnya tetap deterministik, hanya jalannya berbeda.

go.mod
module github.com/kamu/skincare-backend go 1.26

Pada awal project tanpa dependency eksternal, go.sum belum tentu ada. File itu muncul saat kamu menambahkan module eksternal, misalnya nanti ketika memakai chi untuk router atau pgx untuk PostgreSQL.

Terminal
go mod tidy ls

Bagaimana dependency diselesaikan dan diverifikasi

Saat go build atau go mod tidy butuh sebuah dependency, alurnya kira-kira begini: baca daftar di go.mod, cek module cache, unduh bila belum ada, lalu cocokkan hash unduhan dengan go.sum sebelum dipakai.

flowchart TD
  A["go build / go mod tidy"] --> B["Baca daftar dependency di go.mod"]
  B --> C{"Ada di module cache?"}
  C -->|Ya| E["Pakai dari ~/go/pkg/mod"]
  C -->|Tidak| D["Unduh module dari module path"]
  D --> F["Cocokkan hash dengan go.sum"]
  F --> G{"Hash cocok?"}
  G -->|Ya| E
  G -->|Tidak| H["Berhenti: security error"]
  E --> I["Kompilasi program"]

Gambar 3. go.sum adalah gerbang keamanan: bila isi modul yang diunduh tidak cocok dengan hash yang tercatat, Go menolak melanjutkan build.

Tiap modul biasanya punya dua baris di go.sum: satu hash untuk isi pohon modul, satu lagi untuk file go.mod-nya. Untuk modul yang baru pertama kali kamu pakai, Go juga berkonsultasi ke checksum database publik agar yakin hash itu sama dengan yang dilihat seluruh dunia.

checksum database

Log publik dan tahan-rusak berisi hash modul Go, secara default sum.golang.org (diatur lewat GOSUMDB). Go memakainya untuk memverifikasi modul baru sebelum mencatatnya ke go.sum. Modul privat bisa dikecualikan lewat GOPRIVATE.

📝Apa fungsi go mod tidy

go mod tidy menambah dependency yang benar-benar dipakai, menghapus yang tidak dipakai, lalu menyelaraskan go.mod dan go.sum agar bersih dan konsisten.

⚠️go.sum wajib ikut commit

Kalau project sudah memiliki go.sum, commit file itu. Ia membuat tim dan CI memverifikasi dependency yang benar-benar sama, bukan sekadar versi yang mirip.

06

go run untuk Eksekusi Cepat

Mirip node index.js, tetapi tetap dikompilasi

go run memberi pengalaman secepat menjalankan node index.js, tetapi Go tetap mengompilasi program lebih dulu sebelum menjalankannya.

Buat file pertama di root project. Untuk sekarang kita pakai main.go sederhana agar fokus ke workflow, bukan arsitektur besar.

main.go
package main import "fmt" func main() { fmt.Println("skincare-backend siap dipakai") }

Jalankan program:

Terminal
go run .

Output:

Terminal
skincare-backend siap dipakai

Titik pada go run . berarti “package di folder ini”. Kamu juga bisa menyebut file langsung dengan go run main.go, tetapi go run . lebih disukai karena ikut menyertakan semua file di package yang sama.

package main

Package khusus untuk program executable. Bila package bernama main memiliki fungsi main, Go bisa mengompilasinya menjadi binary yang dapat dijalankan.

🌉Jembatan: dari Node runtime ke Go compiler

node index.js menyerahkan file ke runtime Node untuk dieksekusi. go run . mengompilasi package main menjadi binary sementara, menjalankannya, lalu membuangnya. Tetap ada langkah compile, hanya tidak terlihat.

💡Pakai go run untuk feedback cepat

Selama eksplorasi awal, go run . cocok untuk memastikan program bisa dikompilasi dan output sesuai harapan tanpa menyimpan binary ke disk.

07

go build dan Binary

Output berupa executable, bukan script yang butuh runtime Node

go build menghasilkan executable dari package main. Untuk contoh murni Go, output ini bisa dijalankan langsung tanpa membawa folder dependency project.

Terminal
go build -o skincare-backend . ./skincare-backend

Output:

Terminal
skincare-backend siap dipakai

Inilah beda inti go run dan go build. Keduanya sama-sama mengompilasi, tetapi go run membuang binarynya, sedangkan go build menaruh binary permanen di disk untuk kamu jalankan kapan saja.

flowchart TB
  subgraph run["go run ."]
    direction LR
    R1["Source .go"] --> R2["Kompilasi"]
    R2 --> R3["Binary sementara di cache"]
    R3 --> R4["Jalankan lalu dibuang"]
  end
  subgraph build["go build -o skincare-backend ."]
    direction LR
    B1["Source .go"] --> B2["Kompilasi"]
    B2 --> B3["Binary permanen di disk"]
    B3 --> B4["Kamu jalankan kapan saja"]
  end

Gambar 4. go run untuk loop development yang cepat, go build untuk menghasilkan artifact yang dikirim ke server atau dikemas ke container.

📝Nama binary tanpa flag -o

Tanpa -o, go build . di root module menamai binary sesuai elemen terakhir module path, jadi github.com/kamu/skincare-backend menghasilkan file skincare-backend. Memakai -o membuat nama output eksplisit dan tidak bergantung tebakan.

Node.js
  • Kode dijalankan oleh runtime Node di server.
  • Deploy membawa source, package.json, lockfile, dan dependency production.
  • Build frontend menghasilkan asset, tetapi backend Node tetap butuh runtime.
Go
  • Service dikompilasi menjadi executable untuk target OS dan arsitektur.
  • Deploy bisa membawa binary dan konfigurasi runtime saja.
  • Di Docker, binary Go sering membuat image jauh lebih ramping.

Preview cross compile

Nanti saat masuk Docker dan AWS, kamu akan lebih sering membangun binary untuk Linux. Go bisa melakukannya dari mesin apa pun cukup dengan menyetel GOOS dan GOARCH, tanpa memasang toolchain khusus per target.

Terminal
GOOS=linux GOARCH=amd64 go build -o skincare-backend-linux . # Lihat semua target yang didukung toolchain saat ini. go tool dist list
⚠️Binary tetap perlu konteks runtime

Binary mandiri bukan berarti semua masalah deploy hilang. Aplikasi tetap butuh environment variable, koneksi database, strategi migration, dan observability.

08

go test, go fmt, dan go vet

Tiga kebiasaan kecil yang menjaga kualitas sejak awal

Go membawa testing, formatting, dan static analysis dasar di toolchain resmi, jadi standar kualitas minimum tidak bergantung pada selera tiap project.

go test

Menjalankan test bawaan Go dari file *_test.go, tanpa Jest, PHPUnit, atau library test tambahan.

go fmt

Memformat source dengan gaya standar Go. Tidak ada lagi debat tabs vs spaces di code review.

go vet

Mencari pola yang sangat mungkin salah, misalnya format Printf yang tidak cocok dengan argumennya.

Buat fungsi kecil agar kita punya sesuatu untuk dites. File ini sudah mulai terasa seperti domain online shop skincare, walau masih sangat sederhana.

price.go
package main // DiscountedPrice mengurangi harga produk dengan nominal diskon, dalam rupiah. func DiscountedPrice(price, discount int64) int64 { return price - discount }
price_test.go
package main import "testing" func TestDiscountedPrice(t *testing.T) { got := DiscountedPrice(120000, 20000) want := int64(100000) if got != want { t.Fatalf("got %d, want %d", got, want) } }

Jalankan format, vet, lalu test:

Terminal
go fmt ./... go vet ./... go test ./...
📝go test sudah memanggil go vet

Sebelum menjalankan test, go test otomatis menjalankan sebagian pemeriksaan go vet berkepercayaan tinggi. Kamu bisa mematikannya dengan go test -vet=off, tetapi biasanya tidak perlu.

🌉Jembatan: dari Jest atau PHPUnit

Di Jest kamu mengatur lokasi test lewat konfigurasi dan convention. Di Go, convention-nya pasti: file *_test.go di package yang sama dan fungsi berawalan TestXxx dengan parameter *testing.T.

💡gofmt biar otomatis

go fmt ./... menjalankan gofmt pada semua package. Lebih enak lagi, atur editor agar format on save lewat gopls, sehingga kamu hampir tidak pernah menjalankannya manual.

⚠️go vet bukan pengganti semua linter

go vet fokus pada masalah berkepercayaan tinggi. Untuk aturan style tambahan, nanti kita bisa menambah golangci-lint, tetapi bukan di modul fondasi ini.

09

Struktur Folder Minimal

Cukup kecil untuk belajar, cukup rapi untuk tumbuh

Di awal, jangan membuat folder terlalu banyak. Namun kita tetap menyiapkan struktur yang tidak akan terasa berantakan saat masuk API, database, dan domain skincare.

Struktur awal skincare-backend
  • skincare-backend/
  • go.mod
  • go.sum muncul setelah ada dependency eksternal
  • main.go program pertama untuk latihan workflow
  • price.go contoh fungsi domain kecil
  • price_test.go contoh unit test bawaan Go
  • internal/
  • product/
  • model.go nanti untuk domain katalog produk skincare
  • README.md
folder internal/

Convention sekaligus aturan compiler Go: package di bawah internal/ hanya boleh diimpor oleh kode yang berakar di folder induk internal/ itu. Cocok untuk detail aplikasi yang tidak ingin dipakai project lain.

🌉Jembatan: dari struktur Laravel

Laravel memberi struktur besar sejak awal lewat app/Http, app/Models, dan seterusnya. Go lebih minimal, jadi kita menambah folder saat kebutuhan desainnya nyata, bukan karena framework memaksa.

Contoh file model awal

internal/product/model.go
package product type Product struct { ID int64 Name string PriceRupiah int64 }

Untuk modul ini, internal/product/model.go belum dipakai dari main.go. Ia hanya memperlihatkan arah struktur. Perhatikan PriceRupiah bertipe int64, melanjutkan kebiasaan dari modul sebelumnya untuk tidak memakai floating point pada uang.

⚠️Jangan over-engineer dari hari pertama

Jangan langsung membuat folder handler, service, repository, config, dan platform kalau belum ada kode yang membutuhkannya. Struktur yang baik lahir dari kebutuhan, bukan dari template kosong.

10

Hands-on Workflow Harian

Simulasi dari folder kosong sampai binary jalan

Bagian ini bisa kamu ikuti dari terminal kosong. Anggap ini ritual pembuka sebelum kita membangun API skincare yang sebenarnya.

Buat project

Mulai dari folder baru bernama skincare-backend.

Inisialisasi module

Gunakan module path yang akan menjadi alamat repository.

Tulis program dan test kecil

Buat main.go, lalu price.go dan price_test.go agar go test punya sesuatu untuk dijalankan.

Jalankan ritual kualitas

Jalankan go fmt, go vet, go test, go run, lalu go build.

Terminal
mkdir skincare-backend cd skincare-backend go mod init github.com/kamu/skincare-backend cat > main.go <<'EOF' package main import "fmt" func main() { fmt.Println("skincare-backend siap dipakai") } EOF cat > price.go <<'EOF' package main func DiscountedPrice(price, discount int64) int64 { return price - discount } EOF cat > price_test.go <<'EOF' package main import "testing" func TestDiscountedPrice(t *testing.T) { if got := DiscountedPrice(120000, 20000); got != 100000 { t.Fatalf("got %d, want %d", got, 100000) } } EOF go fmt ./... go vet ./... go test ./... go run . go build -o skincare-backend . ./skincare-backend

Setelah itu, cek isi folder:

Terminal
ls -la

Hasil minimum yang masuk akal:

Output
go.mod main.go price.go price_test.go skincare-backend
💡Kebiasaan yang dipakai sampai production

Urutan fmt, vet, test, lalu run atau build akan tetap relevan saat project sudah punya chi, pgx, Docker, CI, dan deploy AWS. Hanya skalanya yang membesar.

11

Jebakan Umum Developer JS/PHP

Hal kecil yang sering membuat setup Go terasa aneh di awal

Sebagian kebingungan awal bukan karena Go sulit, tetapi karena mental model dari Node.js, TypeScript, atau Laravel tidak selalu cocok.

Jebakan yang Perlu Dihindari

  • Mencari node_modules di project. Dependency Go masuk ke module cache global, bukan folder project.
  • Membuat project di ~/go/src karena tutorial lama. Dengan Go Modules, project bisa berada di folder kerja mana pun.
  • Lupa menaruh $GOPATH/bin di PATH. Tool hasil go install ada di sana, kalau PATH belum memuatnya, command tool tidak akan terbaca.
  • Menganggap go run seperti interpreter. go run tetap compile lebih dulu, lalu menjalankan binary sementara.
  • Menghapus go.sum dari repository. Kalau file itu sudah muncul, commit untuk menjaga verifikasi dependency.
  • Menunda go fmt sampai akhir. Format sejak awal agar diff kecil dan review bersih.
  • Menganggap go vet sama dengan linter lengkap. go vet penting, tetapi hanya satu lapisan static analysis.
  • Mengganti module path sembarangan. Module path memengaruhi semua import, jadi pilih dengan niat jangka panjang.
🌉Jembatan: dari TypeScript strict mode

Kalau TypeScript strict mode membantumu menangkap masalah sebelum runtime, Go membawa ide itu lebih jauh lewat compiler, test runner, formatter, dan vet yang sudah tersedia langsung dari toolchain.

⚠️Jangan belajar Go dari tutorial GOPATH lama

Banyak artikel lama masih meminta kamu menaruh project di GOPATH/src. Untuk jalur ini, gunakan Go Modules dan selalu mulai dari go mod init.

12

Ringkasan & Poin Penting

Sekarang kamu sudah punya environment Go dan workflow dasar yang akan menjadi pondasi semua modul berikutnya.

Yang Wajib Menempel

  • Gunakan Go 1.26 dan deklarasikan go 1.26 di go.mod. Lewat GOTOOLCHAIN, baris itu cukup untuk menyamakan versi toolchain antar mesin.
  • go mod init github.com/kamu/skincare-backend menetapkan module path yang sekaligus menjadi prefix import dan alamat unduhan.
  • GOPATH kini berperan untuk module cache dan binary tool, sementara source project modern memakai Go Modules.
  • go.mod adalah pusat metadata dependency, sedangkan go.sum menyimpan checksum yang menolak build bila isi modul berubah.
  • go run . cepat untuk feedback, go build menghasilkan binary permanen yang nanti masuk ke Docker dan AWS.
  • go fmt ./..., go vet ./..., dan go test ./... adalah ritual kualitas minimum sebelum commit, dan go test sudah ikut menjalankan vet.
  • Struktur awal cukup sederhana: go.mod, main.go, test kecil, dan internal/ untuk kode aplikasi yang tidak diekspor keluar module.

Pemetaan ke proyek online shop skincare

API layer

Binary dari go build nanti menjadi service HTTP untuk katalog produk, cart, checkout, order, dan auth.

Worker layer

Workflow yang sama dipakai untuk worker seperti sinkronisasi stok, email order, dan proses pembayaran async.

Langkah berikutnya

Di modul berikutnya kita masuk ke fondasi tipe data Go: deklarasi dengan var dan :=, const, tipe dasar seperti string, int, bool, dan float, lalu zero value, konversi tipe, dan custom type. Dari sana kamu mulai memodelkan harga, kuantitas, status, dan nama produk skincare dengan aman.

Checkpoint sebelum lanjut

Pastikan go version, go run ., go test ./..., go fmt ./..., go vet ./..., dan go build -o skincare-backend . berhasil di laptopmu.

Progress disimpan lokal di browser ini.