Materi
Struct mengelompokkan beberapa field bernama menjadi satu tipe, misalnya type Produk struct dengan field Nama bertipe string dan Harga bertipe int. Nilainya dibuat dengan literal, Produk{Nama: "Kopi", Harga: 18000}, dan field yang tidak disebut berisi nilai nol. Field dibaca dan diisi dengan titik: p.Harga = 20000. Nama yang diawali huruf besar terlihat dari paket lain; huruf kecil hanya terlihat di paketnya sendiri.
Go tidak punya class. Perilaku ditempelkan ke tipe lewat method, yaitu fungsi dengan penerima di depan namanya: func (p Produk) Total(n int) int. Penerima seperti ini disebut penerima nilai. Method menerima salinan struct, sehingga perubahan field di dalamnya hilang begitu method selesai.
Method yang perlu mengubah struct memakai penerima pointer, func (r *Rekening) Setor(n int). Pointer berisi alamat nilai aslinya, sehingga r.Saldo += n mengubah rekening milik pemanggil. Bila a adalah variabel, Go otomatis mengubah a.Setor(50000) menjadi (&a).Setor(50000), jadi cara memanggilnya tidak berubah.
package main
import "fmt"
type Rekening struct {
Pemilik string
Saldo int
}
func (r *Rekening) Setor(n int) {
r.Saldo += n
}
func main() {
a := Rekening{Pemilik: "Sari", Saldo: 100000}
a.Setor(50000)
fmt.Println(a) // {Sari 150000}
fmt.Printf("%+v\n", a) // {Pemilik:Sari Saldo:150000}
}