Field yang Diekspor vs Tidak Diekspor
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GO di Coddy. Pelajaran 47 dari 107.
Di Go, enkapsulasi pada tingkat struct dikendalikan oleh penggunaan huruf besar atau kecil pada nama field. Aturan sederhana ini menentukan apakah field dapat diakses dari luar package tempat struct didefinisikan.
Field yang diawali huruf kapital akan diekspor: dapat diakses dari paket mana pun. Field yang diawali huruf kecil tidak diekspor: hanya dapat diakses di dalam paket yang sama:
// Dalam package "user"
type User struct {
Name string // Diekspor, dapat diakses dari mana saja
Email string // Diekspor, dapat diakses dari mana saja
password string // Tidak diekspor, hanya dapat diakses dalam package "user"
age int // Tidak diekspor, hanya dapat diakses dalam package "user"
}
Ketika package lain mengimpor dan menggunakan struct ini, package tersebut hanya dapat berinteraksi dengan field yang diekspor:
// Di package "main"
import "user"
func main() {
u := user.User{
Name: "Alice", // berfungsi
Email: "a@mail.com", // berfungsi
// password: "secret", // error saat compile: field tidak dikenal
}
fmt.Println(u.Name) // berfungsi
// fmt.Println(u.password) // error saat compile: tidak dapat mengakses field yang tidak diekspor
}
Mekanisme ini melindungi data sensitif dan detail implementasi internal. Field password tidak dapat dibaca atau diubah secara langsung dari luar package, sehingga kode lain harus menggunakan method yang kamu sediakan. Inilah pendekatan Go untuk mencapai penyembunyian data: prinsip inti enkapsulasi dalam pemrograman berorientasi object.
Tantangan
MudahMari kita buat sistem rekening bank yang menunjukkan enkapsulasi melalui field yang diekspor dan tidak diekspor. Kamu akan membuat package yang melindungi data keuangan sensitif sekaligus menampilkan informasi publik yang aman.
Kamu akan mengatur kodemu dalam dua file:
account.go: Buat structBankAccountdalam packagemainyang memodelkan rekening bank sungguhan dengan perlindungan data yang tepat:HolderName(diekspor) - nama pemilik rekening, aman untuk ditampilkan kepada publikAccountType(diekspor) - tipe rekening (misalnya, "Savings", "Checking")balance(tidak diekspor) - saldo sebenarnya, yang harus dilindungipin(tidak diekspor) - PIN rekening, data yang sangat sensitif
NewBankAccountyang menerima nama pemilik rekening, tipe rekening, saldo awal, dan PIN, lalu mengembalikan pointer keBankAccountbaru. Tambahkan juga methodGetPublicInfo() stringyang mengembalikan format:Account: [HolderName] ([AccountType])main.go: Baca detail rekening dari input, buatBankAccountmenggunakan konstruktor, lalu tunjukkan enkapsulasinya. Cetak info publik menggunakan method tersebut, lalu akses langsung dan cetak setiap field yang diekspor pada baris terpisah. Field yang tidak diekspor (balancedanpin) dilindungi. Kamu hanya bisa mengaturnya melalui konstruktor.
Input berikut akan diberikan:
- Baris 1: Nama pemilik rekening
- Baris 2: Tipe rekening
- Baris 3: Saldo awal (sebagai float)
- Baris 4: Kode PIN
Contohnya, jika diberikan Alice Johnson, Savings, 5000.50, dan 1234, output-mu seharusnya:
Account: Alice Johnson (Savings)
Holder: Alice Johnson
Type: SavingsPerhatikan bahwa saldo dan PIN tidak pernah muncul dalam output: keduanya tersembunyi dengan aman di dalam struct, dan hanya dapat diakses di dalam package. Inilah enkapsulasi: data sensitif dilindungi sementara informasi publik tetap dapat diakses.
Coba sendiri
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// Baca nama pemilik rekening
holderName, _ := reader.ReadString('\n')
holderName = strings.TrimSpace(holderName)
// Baca jenis rekening
accountType, _ := reader.ReadString('\n')
accountType = strings.TrimSpace(accountType)
// Baca saldo awal
balanceStr, _ := reader.ReadString('\n')
balanceStr = strings.TrimSpace(balanceStr)
balance, _ := strconv.ParseFloat(balanceStr, 64)
// Baca PIN
pinStr, _ := reader.ReadString('\n')
pin := strings.TrimSpace(pinStr)
// TODO: Buat BankAccount baru menggunakan konstruktor
// account := NewBankAccount(...)
// TODO: Cetak informasi publik menggunakan method GetPublicInfo()
// TODO: Cetak nama pemilik dengan mengakses field yang diekspor secara langsung
// fmt.Println("Holder:", ...)
// TODO: Cetak jenis rekening dengan mengakses field yang diekspor secara langsung
// fmt.Println("Type:", ...)
// Catatan: balance dan pin tidak diekspor, jadi kamu tidak bisa mengaksesnya secara langsung di sini
// Keduanya terenkapsulasi dengan aman di dalam struct
_ = balance // Hapus baris ini saat kamu menggunakan balance
_ = pin // Hapus baris ini saat kamu menggunakan pin
}
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