Menu
Coddy logo textTech

fmt.Stringer Arayüzü

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

fmt.Stringer arayüzü, türlerinizin yazdırıldığında nasıl görüneceğini kontrol eder. Go'da en yaygın uygulanan arayüzlerden biridir ve fmt paketinde tanımlanmıştır:

type Stringer interface {
    String() string
}

Bir değeri fmt.Println, %v ile fmt.Printf veya benzeri fonksiyonlara geçirdiğinizde, Go türün Stringer arayüzünü uygulayıp uygulamadığını kontrol eder. Eğer uyguluyorsa, Go metin temsilini elde etmek için String() metodunu çağırır.

type Temperature struct {
    Celsius float64
}

func (t Temperature) String() string {
    return fmt.Sprintf("%.1f°C", t.Celsius)
}

func main() {
    temp := Temperature{Celsius: 23.5}
    fmt.Println(temp)  // 23.5°C
}

String() metodu olmadan, yazdırma işlemi varsayılan struct formatını gösterirdi: {23.5}. Stringer arayüzünü uygulayarak, türünüzün kendisini tam olarak nasıl sunacağını kontrol edersiniz.

Bu, ham alan değerlerinin anlamı net bir şekilde iletmediği türler için özellikle yararlıdır. Bir Duration türü, ham nanosaniyeleri göstermek yerine "2h 30m" olarak görüntülenebilir veya bir User türü, tüm alanları yerine biçimlendirilmiş bir ad gösterebilir.

challenge icon

Görev

Kolay

Süreleri insan dostu bir formatta görüntüleyen bir zaman takip sistemi oluşturalım! Özel türlerinizin yazdırıldığında nasıl görüneceğini kontrol etmek için fmt.Stringer arayüzünü uygulayacaksınız.

Kodunuzu iki dosya halinde düzenleyeceksiniz:

  • duration.go: Özel dize gösterimlerine sahip zamanla ilgili türlerinizi tanımlayın.

    Toplam dakika sayısını tam sayı olarak saklayan bir Duration yapısı (struct) oluşturun. Yazdırıldığında, 150 dakika için 2h 30m veya 45 dakika için 0h 45m gibi okunabilir bir formatta görüntülenecek şekilde String() metodunu uygulayın. Saat ve dakikalar her zaman gösterilmelidir.

    Name (string) ve Time (Duration) alanlarına sahip bir Task yapısı oluşturun. Task üzerinde String() metodunu, sürenin kendi String metodunu kullandığı [Name]: [duration] formatında görüntülenecek şekilde uygulayın.

  • main.go: Görevleri süreleriyle birlikte oluşturun ve görüntüleyin.

    Görev sayısını okuyun, ardından her görev için adını ve dakika cinsinden süresini okuyun. Task örnekleri oluşturun ve her birini doğrudan fmt.Println kullanarak yazdırın; Stringer arayüzü biçimlendirmeyi otomatik olarak halledecektir.

    Tüm görevleri yazdırdıktan sonra, tüm görevlerin toplam süresini şu formatta hesaplayın ve yazdırın:

    Total: [duration]

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

  • Satır 1: Görev sayısı
  • Sonraki satırlar: Görev adı ve dakikası (her görev için iki satır)

Örneğin, şu girdi verildiğinde:

3
Code Review
90
Meeting
45
Documentation
120

Çıktınız şu olmalıdır:

Code Review: 1h 30m
Meeting: 0h 45m
Documentation: 2h 0m
Total: 4h 15m

Ve şu girdi verildiğinde:

2
Design
180
Testing
65

Çıktınız şu olmalıdır:

Design: 3h 0m
Testing: 1h 5m
Total: 4h 5m

Stringer arayüzünü uygulayarak, türleriniz Go'nun yazdırma işlevleriyle sorunsuz bir şekilde entegre olur. {90} gibi ham yapı alanlarını görmek yerine, kullanıcılar için anlamlı olan çıktılar elde edersiniz.

Kopya kağıdı

fmt.Stringer arayüzü, türlerin yazdırıldığında nasıl görüneceğini kontrol eder:

type Stringer interface {
    String() string
}

Bir değeri fmt.Println'e veya %v ile fmt.Printf'e ilettiğinizde, Go bu türün Stringer arayüzünü uygulayıp uygulamadığını kontrol eder. Eğer uyguluyorsa, Go metin temsilini almak için String() metodunu çağırır.

Örnek uygulama:

type Temperature struct {
    Celsius float64
}

func (t Temperature) String() string {
    return fmt.Sprintf("%.1f°C", t.Celsius)
}

func main() {
    temp := Temperature{Celsius: 23.5}
    fmt.Println(temp)  // 23.5°C
}

String() metodu olmadan, yazdırma işlemi varsayılan struct formatını gösterir: {23.5}. Stringer arayüzünü uygulayarak, türünüzün kendisini tam olarak nasıl sunacağını kontrol eder, çıktıyı daha anlamlı ve kullanıcı dostu hale getirirsiniz.

Kendin dene

package main

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

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

	// Görev sayısını oku
	line, _ := reader.ReadString('\n')
	numTasks, _ := strconv.Atoi(strings.TrimSpace(line))

	// TODO: Görevleri saklamak için bir slice oluştur
	// TODO: Toplam dakikayı takip et

	for i := 0; i < numTasks; i++ {
		// Görev adını oku
		name, _ := reader.ReadString('\n')
		name = strings.TrimSpace(name)

		// Dakika cinsinden görev süresini oku
		minutesLine, _ := reader.ReadString('\n')
		minutes, _ := strconv.Atoi(strings.TrimSpace(minutesLine))

		// TODO: Ad ve Duration ile bir Task oluştur
		// TODO: Görevi yazdır (fmt.Println, Stringer arayüzünü kullanacaktır)
		// TODO: Dakikaları toplama ekle
		_ = name
		_ = minutes
	}

	// TODO: Toplam süreyi "Total: Xh Ym" formatında yazdır
}
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