Blank identifier (_) to specjalny identyfikator w Go, który służy do ignorowania wartości. Używa się go, gdy zwracana przez funkcję wartość nie jest potrzebna, przy imporcie pakietów tylko w celu wywołania ich init lub przy implementacji interfejsów.
Przykłady:
// Ignorujemy zwracaną wartość błędu data, _ := ioutil.ReadFile("file.txt") // Import pakietu tylko dla efektów ubocznych import _ "net/http/pprof"
Ponadto, blank identifier pomaga przy implementacji interfejsu, nie używając jawnie wszystkich metod:
var _ io.Reader = (*MyReader)(nil) // kompilacja nie powiedzie się, jeśli typ nie implementuje interfejsu
Czy można używać blank identifier do ciągłego tłumienia błędów? Czy to bezpieczna praktyka?
Odpowiedź: Nie. Chociaż blank identifier pozwala ignorować błąd, nie jest to bezpieczna praktyka — tłumienie błędów często prowadzi do poważnych błędów lub niepoprawnego działania programu. Zawsze należy świadomie obsługiwać błędy i tylko w zrozumiałych miejscach (na przykład, jawnie nieistotnych dla logiki) używać blank identifier do ich tłumienia.
Historia
W aplikacji do pracy z plikami programista wszędzie stosował konstrukcję _, _ = file.Write(...), ignorując błędy przy zapisie. W wyniku tego, przy przepełnieniu dysku lub awarii zapisu, program kontynuował działanie „jakby wszystko było w porządku”, co prowadziło do utraty danych.
Historia
W jednym projekcie audytor uważał, że jeśli funkcja zwraca błąd, zawsze należy go tłumić (_). Z tego powodu podczas testów nie zauważono błędów podczas zapisywania logów działań — ważne dane były tracone, a przyczyna nie była zrozumiała.
Historia
Student, ucząc się Go, używał blank identifier przy imporcie kilku zewnętrznych pakietów, chociaż nie było to wcale konieczne. W wyniku tego rozmiar pliku binarnego wzrósł prawie dwukrotnie, ponieważ wszystkie efekty uboczne pakietów zostały uwzględnione w finalnej aplikacji.