Method Getter dan Setter
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GO di Coddy. Pelajaran 49 dari 107.
Karena field yang tidak diekspor tidak dapat diakses langsung dari luar package, kamu perlu menyediakan method yang memungkinkan akses terkontrol. Method ini biasanya disebut getter dan setter.
Di Go, konvensi untuk getter sederhana: gunakan nama field dengan huruf pertama kapital. Jangan tambahkan awalan "Get", cukup gunakan Balance(), bukan GetBalance():
type BankAccount struct {
balance int // tidak diekspor
}
// Getter: mengembalikan nilai
func (b *BankAccount) Balance() int {
return b.balance
}
// Setter: mengubah nilai dengan validasi
func (b *BankAccount) SetBalance(amount int) {
if amount >= 0 {
b.balance = amount
}
}
Kekuatan sebenarnya dari setter adalah menambahkan validasi atau logika bisnis. Alih-alih membiarkan kode eksternal menetapkan nilai apa pun secara langsung, kamu mengontrol apa yang diizinkan:
func (b *BankAccount) Deposit(amount int) bool {
if amount <= 0 {
return false
}
b.balance += amount
return true
}
method Deposit ini bertindak sebagai setter khusus yang menerapkan aturan: setoran negatif tidak diizinkan. Kode eksternal harus menggunakan method milikmu agar struct selalu berada dalam kondisi yang valid. Inilah enkapsulasi dalam praktik: menyembunyikan data sambil menyediakan perilaku yang terkontrol.
Tantangan
MudahMari buat konverter suhu yang menunjukkan enkapsulasi yang tepat menggunakan method getter dan setter. Kamu akan membuat struct yang menyimpan suhu secara internal dalam Celsius, tetapi menyediakan akses terkontrol melalui method dengan validasi.
Kamu akan mengatur kodemu dalam dua file:
temperature.go: Buat structTemperaturedengan fieldcelsiusyang tidak diekspor (float64). Implementasikan method berikut:Celsius()- getter yang mengembalikan suhu saat ini dalam CelsiusSetCelsius(value float64)- setter yang hanya menerima nilai pada atau di atas nol mutlak (-273.15). Jika nilainya di bawah ambang ini, suhu harus tetap tidak berubah.Fahrenheit()- mengembalikan suhu yang dikonversi ke Fahrenheit menggunakan rumus:(celsius * 9/5) + 32SetFahrenheit(value float64)- mengonversi input dari Fahrenheit ke Celsius dan menyimpannya, tetapi hanya jika nilai Celsius hasil konversi berada pada atau di atas -273.15
NewTemperature(celsius float64) *Temperatureyang membuat suhu dengan nilai awal yang diberikan (anggap input untuk constructor valid).main.go: Baca nilai suhu dari input dan tunjukkan method getter/setter. Buat suhu, tampilkan nilainya dalam kedua satuan, lalu coba atur nilai baru dan tampilkan hasilnya.
Input berikut akan diberikan:
- Baris 1: Nilai Celsius awal
- Baris 2: Nilai Celsius baru yang akan diatur
- Baris 3: Nilai Fahrenheit baru yang akan diatur
Format semua output suhu dengan dua angka di belakang koma. Cetak urutan berikut:
- Setelah dibuat:
C: [celsius] F: [fahrenheit] - Setelah mengatur Celsius:
C: [celsius] F: [fahrenheit] - Setelah mengatur Fahrenheit:
C: [celsius] F: [fahrenheit]
Misalnya, jika diberikan 25, -300, dan 212, outputmu seharusnya:
C: 25.00 F: 77.00
C: 25.00 F: 77.00
C: 100.00 F: 212.00Perhatikan bahwa baris kedua menunjukkan nilai yang tidak berubah karena -300 berada di bawah nol mutlak, sehingga setter menolaknya. Baris ketiga menunjukkan suhu setelah berhasil mengatur 212°F (yang dikonversi menjadi 100°C). Inilah keunggulan setter. Setter menerapkan aturan yang menjaga datamu tetap valid.
Coba sendiri
package main
import (
"fmt"
)
func main() {
// Baca nilai input
var initialCelsius float64
var newCelsius float64
var newFahrenheit float64
fmt.Scanln(&initialCelsius)
fmt.Scanln(&newCelsius)
fmt.Scanln(&newFahrenheit)
// TODO: Buat Temperature baru menggunakan konstruktor
// TODO: Cetak nilai awal dalam format "C: [celsius] F: [fahrenheit]" dengan 2 angka di belakang koma
// TODO: Coba atur nilai Celsius baru dan cetak hasilnya
// TODO: Coba atur nilai Fahrenheit baru dan cetak hasilnya
}
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