Eğer bir kullanıcı türü
String() string
yöntemini uygularsa, bu değer fmt fonksiyonlarında (örneğin, fmt.Println, fmt.Printf("%v"), log paketlerinde) kullanıldığında, bu yöntemi çağırarak string temsili elde eder.
String() yöntemini kullanıcı türü varlıkları için uygulamak, standart fmt (%v) yerine anlamlı, okunabilir bir çıktı almak için faydalıdır. Çıktının kısa, kullanım bağlamına uygun ve mümkünse güvenli (hassas verilerin sızmaması) olması önerilir.
Uygulama örneği:
type Order struct { ID string Amount int } func (o Order) String() string { return fmt.Sprintf("Order[%s]: %d", o.ID, o.Amount) } func main() { o := Order{"A123", 99} fmt.Println(o) } // Çıktı: Order[A123]: 99
Eğer yöntem hatalarla veya yetersiz bir şekilde uygulanırsa, bu anlamı olmayan veya tehlikeli bir çıktı ile loglanmaya yol açar ve hata bulmayı zorlaştırır.
Cevap: String() yöntemi, gösterici türünde uygulanmışsa çağrılacaktır. Eğer sadece değere uygulanmışsa ancak kodda tür — gösterici ise, Go'nun işaretçi alıcı olmadan yöntemlerin otomatik dereferencing özelliği sayesinde çağrılır. Genellikle bu sorun değildir, fakat eğer yöntem yalnızca gösterici nesnesinde uygulanmışsa ve değer için çağırıyorsanız, derleme hatası ile karşılaşılır.
Örnek:
type X struct{} func (x *X) String() string { return "ptr" } fmt.Println(X{}) // hata: X String'i uygulamıyor fmt.Println(&X{}) // tamam, yöntem çağrılacak
Hikaye
Büyük bir projede hata türü, sadece gösterici alıcıda (
func (err *MyErr) String() string) String() yöntemini uyguladı. Bu nedenle hata değeri geri döndürüldüğünde (işaretçi değil) loglara değersiz{}yazdırılıyordu, yararlı bir mesaj yerine. Hata uzun süre fark edilmedi.
Hikaye
Bir tür, hassas verileri saklıyordu ve String() yönteminin hatalı uygulanması (alanları açıkça yazdırma) kullanıcı şifrelerinin üretim loglarında görünmesine neden oldu. Güvenlik denetimi gerekti.
Hikaye
String() otomatik üretilmesi, yapının güncellenmesi sırasında yeni çıktı formatının önceki ile uyuşmamasına neden oldu, loglar okunamaz hale geldi, üçüncü taraf sistemlerin log ayrıştırması bozuldu.