Pythonistalar için Nesnenin String() Görüntüsü

python’daki __str__ ve __repr__ metodlarının golang karşılığını arıyordum. Karşıma String() çıktı…

Örneğin python’da User adlı bir nesne yazmaya karar verdik:

class User:
    pass

u = User()
print(u) # <__main__.User object at 0x10c92d940>

python bize nesnenin adını ve hafızadaki adresini döner geriye. Eğer __repr__ metodunu düzenlersek;

class User:
    def __repr__(self):
        return '<{name}>'.format(name=self.__class__.__name__)

u = User()
print(u) # <User>

şeklinde çıktı alırız.

Benzer işlemi golang’da yapmak için bize built-in gelen Stringer interface’ini kullanıyoruz:

type Stringer interface {
   String() string
}

Herhangi bir tip, eğer Stringer interface’inin String() metodunu memnun ediyorsa ya da bu görevi yerine getiriyorsa (satisfiy) Print türevleri tüm fonksiyonlarda aynı python’daki __repr__ işini yapmak mümkün hale geliyor.

Şimdi vigo adında uydurma bir int tipi yapıp Printf ile çıktıya bakalım:

package main

import "fmt"

type vigo int

func (v vigo) String() string {
    // example purpose only
    switch {
    case v > 20:
        return "20+"
    case v > 10:
        return "10+"
    default:
        return fmt.Sprintf("%d", v)
    }
}

func main() {
    number := vigo(22)
    compareNumber := 21

    fmt.Printf("vigo(12): %v\n", vigo(12)) // vigo(12): 10+
    fmt.Printf("vigo(12): %s\n", vigo(12)) // vigo(12): 10+
    fmt.Printf("vigo(12): %d\n", vigo(12)) // vigo(12): 12
    fmt.Printf("vigo(21): %v\n", vigo(21)) // vigo(21): 20+

    if number > vigo(compareNumber) {
        fmt.Printf("%d is greater than %d\n", number, compareNumber)
        // 22 is greater than 21
    }
}

func (v vigo) String() string ile printer fonksiyonlarının ihtiyacı olan metodu tamamlamış oluyoruz. Tanımladığımız vigo tipindeki sayı 10 değerinden sayısal olarak büyük olunca 10+, 20 değerinden büyük olunca da 20+ yazdırıyoruz. İç dünyasında int değer taşımasına rağmen, yazdırma durumunda yani %v ve %s kullanımında bizim String() metodu devreye giriyor. %d formatında ise sayısal değeri olan 12’yi görmeye devam ediyoruz.

number değişkeni vigo tipinde 22 tutuyor, compareNumber değişkeni de bildiğimiz int tipinde 21 tutuyor. number’ın compareNumber’dan büyük olup olmadığını test etmek için compareNumber’ı vigo tipine çeviriyoruz.

Özetle printer formatlama değerleri için farklı gösterimler yapmak mümkün :)