fmt.Printf
çıktılarını stdout'a çağırmak, test frameworkü kullanarak yapmamız çok zor.Printf
altında sadece Fprintf
çağırıyor ve os.Stdout
'u parametre olarak gönderiyor.os.Stdout
nedir? Fprintf
, 1. argüman için kendisine ne iletilmesini bekliyor?io.Writer
os.Stdout
'un io.Writer
implemente ettiğini sonucunu çıkarabiliriz; Printf
, os.Stdout
'u io.Writer
bekleyen Fprintf
'e gönderir.Writer
'ı kullandığımızı biliyoruz. Kodumuzu test edilebilir ve daha fazla yeniden kullanılabilir hale getirmek için bu mevcut soyutlamayı kullanalım.bytes
paketindeki Buffer
tipi,Writer
interfaceini implemente eder, çünkü Write(p []byte) (n int, err error)
metoduna sahip.Writer
olarak göndermek için testimizde kullanacağız Greet
'i çağırdıktan sonra ona ne yazıldığını kontrol edebiliriz.Hello, Chris di_test.go:16: got '' want 'Hello, Chris'
fmt.Fprintf
'in fmt.Printf
gibi olduğunu hatırla ancak string göndermek için Writer
'ı alır, oysa fmt.Printf
varsayılan olarak stdouttur.Greet
fonksiyonunu stdout'a yazdırmasını istediğimiz bir Go uygulamasına bağlamayı deneyin../di.go:14:7: cannot use os.Stdout (type *os.File) as type *bytes.Buffer in argument to Greet
fmt.Fprintf
, hem os.Stdout
hem de bytes.Buffer
implementationını bildiğimiz bir io.Writer
göndermenize izin verir.io.Writer
kullanarak başka hangi yerlere veri yazabiliriz? Greet
fonksiyonumuz ne kadar kullanışlı?http.ResponseWriter
istek (request) yapmak için kullanılan http.Request
verilir. Sunucuyu implemente ettiğinizde, writer kullanarak cevabınızı yazarsınız.http.ResponseWriter
'ın io.Writer
'ı implemente ettiğini tahmin ediyorsunuzdur, bu sayede handlerımızda Greet
fonksiyonumuzu kullanabiliriz.io.Writer
interfaceine aşina oldukça, testimizde bytes.Buffer
'ı Writer
olarak kullanabileceğiz ve fonksiyonumuzu komut satırı uygulamasında veya web sunucusunda kullanmak için standart kütüphaneden diğer Writer
ları kullanabiliriz.