Menu
Coddy logo textTech

Boş Arayüz (any)

Coddy'nin GO Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 28 / 107.

Boş arayüz, sıfır metoda sahip bir arayüzdür. Go'daki her tür en az sıfır metoda sahip olduğu için, her tür otomatik olarak boş arayüzü sağlar. Bu, onun her türden değeri tutabilmesini sağlar.

var anything interface{}

anything = 42
anything = "hello"
anything = true
anything = []int{1, 2, 3}

Go 1.18 ile başlayarak, any anahtar kelimesi interface{} için bir takma ad olarak tanıtıldı. Tamamen birbirlerinin yerine kullanılabilirler, ancak any okuması daha temizdir.

var value any = "Go is awesome"

Boş arayüz (empty interface), bilinmeyen veya değişken türlerdeki değerleri işlemeniz gerektiğinde kullanışlıdır. fmt.Println gibi fonksiyonlar, herhangi bir türdeki argümanları kabul etmek için bunu kullanır:

func PrintAnything(v any) {
    fmt.Println("Value:", v)
}

func main() {
    PrintAnything(100)
    PrintAnything("text")
    PrintAnything(3.14)
}

Ancak, bir ödünleşim söz konusudur. Bir değer boş bir arayüzde (empty interface) saklandığında, o değerin özel tür bilgilerine erişiminizi kaybedersiniz.

Altta yatan türü önce çıkarmadan, doğrudan metotları çağıramaz veya alanlara erişemezsiniz. Gelecek dersler, tür onaylamaları (type assertions) ve tür anahtarları (type switches) kullanarak boş bir arayüzden somut türün nasıl elde edileceğini kapsayacaktır.

challenge icon

Görev

Kolay

Boş arayüzü (empty interface) kullanarak her türden değeri tutabilen esnek bir depolama konteyneri oluşturalım. any tipinin aynı yapı içinde farklı türleri saklamanıza nasıl olanak tanıdığını gösteren basit bir kutu oluşturacaksınız.

Kodunuzu iki dosya halinde düzenleyeceksiniz:

  • box.go: any tipinde tek bir Content alanına sahip bir Box yapısı (struct) tanımlayın. Herhangi bir türde bir değer kabul eden ve bu değeri içeren bir Box'a işaretçi (pointer) döndüren bir NewBox yapıcı (constructor) fonksiyonu oluşturun. Kutuda neyin saklandığını gösteren bir dize (string) döndüren bir Describe metodu ekleyin.
  • main.go: Girdiden farklı değerler okuyun; bir tam sayı (integer), bir dize (string) ve bir mantıksal değer (boolean) içeren kutular oluşturun, ardından aynı Box tipinin nasıl tamamen farklı değerler tutabildiğini göstermek için her kutunun açıklamasını yazdırın.

Aşağıdaki girdiler sağlanacaktır:

  • Satır 1: Bir tam sayı (integer) değeri
  • Satır 2: Bir dize (string) değeri
  • Satır 3: Bir mantıksal (boolean) değer (true veya false)

Describe metodunuz şu formatta bir dize döndürmelidir:

Box contains: [value]

Örneğin, 42, hello ve true verildiğinde, çıktınız şöyle olmalıdır:

Box contains: 42
Box contains: hello
Box contains: true

Buradaki temel nokta, tek bir Box yapınızın bir tam sayı, bir dize veya bir mantıksal değer saklayabilmesidir; bunun nedeni any tipinin her türden değeri kabul etmesidir. Her kutu farklı bir şey tutar, ancak hepsi aynı Box tipindedir.

Kopya kağıdı

Boş arayüz (interface{}), sıfır metoda sahip bir arayüzdür. Go'daki her tür en az sıfır metoda sahip olduğundan, her tür otomatik olarak boş arayüzü karşılar ve bu da onu her türden değeri tutabilir hale getirir.

var anything interface{}

anything = 42
anything = "hello"
anything = true
anything = []int{1, 2, 3}

Go 1.18'den başlayarak, any anahtar kelimesi interface{} için bir takma ad olarak tanıtıldı. Bunlar tamamen birbirinin yerine kullanılabilir, ancak any okunması daha temizdir:

var value any = "Go is awesome"

Boş arayüz, bilinmeyen veya değişen türlerdeki değerleri işlemek için kullanışlıdır. Fonksiyonlar her türden argümanı kabul edebilir:

func PrintAnything(v any) {
    fmt.Println("Value:", v)
}

func main() {
    PrintAnything(100)
    PrintAnything("text")
    PrintAnything(3.14)
}

Ödünleşim (Tradeoff): Bir değer boş bir arayüzde saklandığında, onun özel tür bilgilerine erişimi kaybedersiniz. Tür onaylamaları (type assertions) veya tür anahtarları (type switches) kullanarak temel türü çıkarmadan yöntemleri doğrudan çağıramaz veya alanlara erişemezsiniz.

Kendin dene

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func main() {
	reader := bufio.NewReader(os.Stdin)

	// Tam sayı değerini oku
	line1, _ := reader.ReadString('\n')
	intVal, _ := strconv.Atoi(strings.TrimSpace(line1))

	// Dize (string) değerini oku
	line2, _ := reader.ReadString('\n')
	strVal := strings.TrimSpace(line2)

	// Mantıksal (boolean) değeri oku
	line3, _ := reader.ReadString('\n')
	boolVal, _ := strconv.ParseBool(strings.TrimSpace(line3))

	// TODO: NewBox kullanarak her değer için kutular oluşturun
	// TODO: Describe metodunu kullanarak her kutunun açıklamasını yazdırın

	// Derleme hatalarını önlemek için değişkenleri kullanın (uygulama sırasında bu satırları kaldırın)
	_ = intVal
	_ = strVal
	_ = boolVal

	// Örnek çıktı formatı:
	// fmt.Println(box.Describe())
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler