Interface Kosong (any)
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GO di Coddy. Pelajaran 28 dari 107.
interface kosong adalah interface tanpa method. Karena setiap tipe di Go memiliki setidaknya nol method, setiap tipe otomatis memenuhi interface kosong. Ini membuatnya mampu menampung nilai dari tipe apa pun.
var anything interface{}
anything = 42
anything = "hello"
anything = true
anything = []int{1, 2, 3}Mulai Go 1.18, kata kunci any diperkenalkan sebagai alias untuk interface{}. Keduanya dapat saling menggantikan sepenuhnya, tetapi any lebih mudah dibaca.
var value any = "Go is awesome"Interface kosong berguna saat kamu perlu menangani nilai dengan tipe yang tidak diketahui atau beragam. Fungsi seperti fmt.Println menggunakannya untuk menerima argumen dengan tipe apa pun:
func PrintAnything(v any) {
fmt.Println("Value:", v)
}
func main() {
PrintAnything(100)
PrintAnything("text")
PrintAnything(3.14)
}Namun, ada konsekuensinya. Saat sebuah nilai disimpan dalam interface kosong, kamu kehilangan akses ke informasi tipe spesifiknya.
Kamu tidak bisa langsung memanggil method atau mengakses field tanpa terlebih dahulu mengambil tipe yang mendasarinya. Pelajaran berikutnya akan membahas cara mendapatkan tipe konkret dari interface kosong menggunakan type assertion dan type switch.
Tantangan
MudahMari kita buat wadah penyimpanan fleksibel yang dapat menampung nilai dengan tipe apa pun menggunakan interface kosong. Kamu akan membuat box sederhana yang menunjukkan bagaimana any memungkinkan kamu menyimpan tipe yang berbeda dalam struktur yang sama.
Kamu akan mengatur kodemu dalam dua file:
box.go: Definisikan structBoxdengan satu fieldContentbertipeany. Buat fungsi konstruktorNewBoxyang menerima nilai dengan tipe apa pun dan mengembalikan pointer ke Box yang berisi nilai tersebut. Tambahkan methodDescribeyang mengembalikan string untuk menunjukkan isi box.main.go: Baca nilai yang berbeda dari input, buat box yang berisi integer, string, dan boolean, lalu cetak deskripsi setiap box untuk menunjukkan bahwa tipe Box yang sama dapat menampung nilai yang sangat berbeda.
Input berikut akan diberikan:
- Baris 1: Nilai integer
- Baris 2: Nilai string
- Baris 3: Nilai boolean (
trueataufalse)
Method Describe-mu harus mengembalikan string dengan format ini:
Box contains: [value]Misalnya, jika diberikan 42, hello, dan true, outputmu harus seperti ini:
Box contains: 42
Box contains: hello
Box contains: trueInti pentingnya adalah struct Box milikmu dapat menyimpan integer, string, atau boolean: semuanya karena tipe any menerima nilai dengan tipe apa pun. Setiap box menyimpan sesuatu yang berbeda, tetapi semuanya bertipe Box yang sama.
Coba sendiri
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// Baca nilai integer
line1, _ := reader.ReadString('\n')
intVal, _ := strconv.Atoi(strings.TrimSpace(line1))
// Baca nilai string
line2, _ := reader.ReadString('\n')
strVal := strings.TrimSpace(line2)
// Baca nilai boolean
line3, _ := reader.ReadString('\n')
boolVal, _ := strconv.ParseBool(strings.TrimSpace(line3))
// TODO: Buat box untuk setiap nilai menggunakan NewBox
// TODO: Cetak deskripsi setiap box menggunakan method Describe
// Gunakan variabel ini agar tidak terjadi error saat compile (hapus baris ini saat kamu mengimplementasikannya)
_ = intVal
_ = strVal
_ = boolVal
// Contoh format output:
// fmt.Println(box.Describe())
}
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