Dasar-Dasar Pointer di Go
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GO di Coddy. Pelajaran 19 dari 107.
Pointer adalah variabel yang menyimpan alamat memori variabel lain. Alih-alih menyimpan nilai secara langsung, variabel ini menyimpan lokasi tempat nilai tersebut berada di memori. Pointer merupakan dasar Go dan penting untuk manipulasi data yang efisien.
Untuk membuat pointer, gunakan operator & untuk mendapatkan alamat variabel, dan operator * untuk mendeklarasikan tipe pointer atau mengakses nilai pada alamat tersebut.
x := 42
p := &x // p menyimpan alamat memori x
fmt.Println(p) // 0xc000018030 (alamat memori)
fmt.Println(*p) // 42 (nilai pada alamat tersebut)Operator & berarti "alamat dari" dan mengembalikan pointer. Operator *, saat digunakan pada pointer, berarti "nilai pada" dan disebut dereferencing. Kamu juga dapat mengubah nilai asli melalui pointer.
x := 10
p := &x
*p = 25 // ubah nilai melalui pointer
fmt.Println(x) // 25 (variabel asli berubah)Tipe pointer ditulis sebagai *T, dengan T sebagai tipe yang ditunjuk. Pointer ke int memiliki tipe *int.
var p *int // mendeklarasikan pointer ke int
x := 100
p = &x // p sekarang menunjuk ke xNilai nol dari pointer adalah nil, artinya pointer tersebut tidak menunjuk ke apa pun. Mencoba melakukan dereferensi pada pointer nil menyebabkan panic saat runtime, jadi selalu pastikan pointer sudah diinisialisasi sebelum digunakan.
Tantangan
MudahMari buat penukar nilai sederhana yang menunjukkan kemampuan pointer untuk mengubah variabel melalui alamat memorinya.
Kamu akan menyusun kodemu dalam dua file:
swap.go: Buat fungsi bernamaSwapValuesyang menerima dua pointer*intsebagai parameter. Fungsi ini harus menukar nilai yang ditunjuk oleh kedua pointer tersebut. Setelah fungsi dipanggil, setiap variabel harus menyimpan nilai awal variabel lainnya. Fungsi ini tidak mengembalikan apa pun, tetapi langsung mengubah nilai melalui pointer.main.go: Baca dua bilangan bulat dari input, simpan dalam variabel, lalu gunakan fungsiSwapValuesuntuk menukar nilainya. Cetak kedua nilai sebelum dan sesudah penukaran untuk menunjukkan perubahannya.
Input berikut akan diberikan:
- Baris 1: Bilangan bulat pertama
- Baris 2: Bilangan bulat kedua
Format output:
Before: a=[first] b=[second]
After: a=[first] b=[second]Misalnya, jika diberikan 10 dan 25, outputmu seharusnya:
Before: a=10 b=25
After: a=25 b=10Ingat untuk menggunakan operator & saat meneruskan variabelmu ke fungsi, dan operator * di dalam fungsi untuk mengakses dan mengubah nilai sebenarnya.
Coba sendiri
package main
import "fmt"
func main() {
// Baca dua bilangan bulat dari input
var a, b int
fmt.Scanln(&a)
fmt.Scanln(&b)
// Tampilkan nilai sebelum ditukar
fmt.Printf("Before: a=%d b=%d\n", a, b)
// TODO: Panggil fungsi SwapValues dengan pointer ke a dan b
// Ingat, gunakan operator & untuk meneruskan alamat
// Tampilkan nilai setelah ditukar
fmt.Printf("After: a=%d b=%d\n", a, b)
}
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