Menu
CoddyTech

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.

challenge icon

Tantangan

Mudah

Mari 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 struct Box dengan satu field Content bertipe any. Buat fungsi konstruktor NewBox yang menerima nilai dengan tipe apa pun dan mengembalikan pointer ke Box yang berisi nilai tersebut. Tambahkan method Describe yang 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 (true atau false)

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: true

Inti 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())
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Go online