Pointer ke Struct
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GO di Coddy. Pelajaran 20 dari 107.
Saat bekerja dengan struct, kamu akan sering menggunakan pointer untuk menghindari penyalinan struktur data yang besar dan untuk mengubah struct asli. Pointer ke struct menyimpan alamat memori dari instance struct tersebut.
Kamu bisa membuat pointer struct menggunakan operator & pada struct yang sudah ada, atau menggunakan operator alamat secara langsung dengan literal struct.
type Person struct {
Name string
Age int
}
p := Person{Name: "Alice", Age: 30}
ptr := &p // pointer ke struct yang sudah ada
// Atau buat langsung
ptr2 := &Person{Name: "Bob", Age: 25}Go menyediakan cara singkat yang praktis untuk mengakses field struct melalui pointer. Daripada menulis (*ptr).Name, kamu bisa langsung menulis ptr.Name. Go secara otomatis melakukan dereferensi pointer untukmu.
ptr := &Person{Name: "Alice", Age: 30}
// Keduanya bekerja dengan cara yang sama
fmt.Println((*ptr).Name) // dereferensi eksplisit
fmt.Println(ptr.Name) // dereferensi otomatisDereferensi otomatis ini juga berlaku saat mengubah field. Perubahan melalui pointer memengaruhi struct asli.
p := Person{Name: "Alice", Age: 30}
ptr := &p
ptr.Age = 31 // mengubah nilai asli
fmt.Println(p.Age) // 31Pointer struct sangat penting dalam pola OOP Go. Pointer struct memungkinkan method mengubah keadaan receiver, memungkinkan struct berukuran besar diteruskan secara efisien ke fungsi, dan menjadi fondasi untuk membangun struktur data tertaut seperti tree dan list.
Tantangan
MudahMari kita buat sistem rekening bank yang menunjukkan cara pointer struct memungkinkan kamu mengubah data asli secara efisien. Kamu akan membuat rekening yang dapat diperbarui melalui operasi pointer.
Kamu akan menyusun kodemu dalam dua file:
account.go: Definisikan structBankAccountdengan fieldOwner(string),Balance(float64), danAccountNumber(string). Buat fungsi bernamaNewAccountyang menerima nama pemilik dan nomor rekening sebagai parameter, lalu mengembalikan pointer keBankAccountbaru dengan saldo awal 0. Buat juga fungsiDeposityang menerima pointer*BankAccountdan sejumlah nilai, lalu menambahkan nilai tersebut ke saldo rekening melalui pointer.main.go: Baca informasi rekening dari input, buat rekening menggunakan fungsi konstruktor (yang mengembalikan pointer), lakukan setoran menggunakan pointer, lalu tampilkan detail rekening untuk memastikan saldo telah diubah.
Input berikut akan diberikan:
- Baris 1: Nama pemilik
- Baris 2: Nomor rekening
- Baris 3: Jumlah setoran (float)
Format output:
Account: [AccountNumber]
Owner: [Owner]
Balance: [Balance]Contohnya, jika diberikan John Smith, ACC-12345, dan 500.50, outputmu seharusnya:
Account: ACC-12345
Owner: John Smith
Balance: 500.50Ingat, fungsi NewAccount harus mengembalikan *BankAccount menggunakan operator &, dan fungsi Deposit dapat mengubah saldo secara langsung melalui pointer menggunakan dereferensi otomatis Go (misalnya, account.Balance alih-alih (*account).Balance).
Coba sendiri
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// Baca nama pemilik
ownerName, _ := reader.ReadString('\n')
ownerName = strings.TrimSpace(ownerName)
// Baca nomor rekening
accountNumber, _ := reader.ReadString('\n')
accountNumber = strings.TrimSpace(accountNumber)
// Baca jumlah setoran
amountStr, _ := reader.ReadString('\n')
amountStr = strings.TrimSpace(amountStr)
amount, _ := strconv.ParseFloat(amountStr, 64)
// TODO: Buat rekening baru menggunakan fungsi NewAccount (mengembalikan pointer)
// TODO: Setorkan uang menggunakan fungsi Deposit dengan pointer rekening
// TODO: Cetak detail rekening dalam format yang diminta:
// Rekening: [AccountNumber]
// Pemilik: [Owner]
// Saldo: [Balance]
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP di Go
File EksternalWorkspace Go dan modulePaket dan ImporNama yang Diekspor dan Tidak DieksporPengantar OOP di Gostruct sebagai classMendefinisikan method pada structPointer receiver vs value receiverInisialisasi structFungsi KonstruktorUlasan: Kalkulator Sederhana4Interface
Pengenalan InterfaceImplementasi ImplisitInterface sebagai KontrakInterface Kosong (any)Type AssertionType SwitchKomposisi InterfaceInterface Stringer & ErrorUlasan: Kalkulator Bentuk7Enkapsulasi
Field yang Diekspor vs Tidak DieksporEnkapsulasi Tingkat PackageMethod Getter dan SetterPenyembunyian Informasi di GoRingkasan: Data Siswa10Generics (Go 1.18+)
Pengantar GenericsParameter TipeBatasan TipeStruct GenerikCara Alternatif untuk Method GenerikRingkasan Koleksi Generik2Mendalami Tipe dan Struct
Tipe Dasar dan KompositDefinisi Tipe KustomTag StructStruct AnonimStruct BersarangNilai Nol dan Nilai BawaanRangkuman: Buku Kontak5Komposisi daripada Pewarisan
Mengapa Go Tidak Memiliki PewarisanDasar Penyematan StructPromosi methodMenyematkan Beberapa StructPenyematan vs AgregasiMembayangi method yang DisematkanRangkuman: Hierarki Karyawan8Penanganan Error & OOP
Interface errorTipe Error KustomPembungkusan Error (fmt.Errorf)Error Sentinelerrors.Is() dan errors.As()Panic, Defer, dan RecoverRangkuman: Parser File3Pointer dan Memori
Dasar-Dasar Pointer di GoPointer ke StructPass by Value vs ReferenceFungsi new()Garbage Collection di GoRekap: Pembuat Linked List6Polimorfisme di Go
Polimorfisme melalui InterfaceDuck Typing di GoAturan Pemenuhan InterfaceKoleksi PolimorfikInjeksi DependensiRangkuman: Pemroses Pembayaran9Konkruensi & OOP
Dasar-dasar GoroutineChannel & KomunikasiChannel Ber-buffer vs Tanpa BufferPernyataan selectsync.Mutex & sync.RWMutexsync.WaitGroupDesain Struct yang Aman untuk ThreadRingkasan: Worker PoolLatihan sendiri: Compiler Go online