Blank identifier (_) is een speciale identifier in Go die wordt gebruikt om waarden te negeren. Het wordt gebruikt wanneer de geretourneerde waarde van een functie niet nodig is, bij het importeren van pakketten alleen voor het oproepen van hun init of bij het implementeren van interfaces.
Voorbeelden:
// Negeer de geretourneerde foutwaarde data, _ := ioutil.ReadFile("file.txt") // Import van een pakket alleen voor bijeffecten import _ "net/http/pprof"
Bovendien helpt de blank identifier bij het implementeren van een interface zonder expliciet alle methoden te gebruiken:
var _ io.Reader = (*MyReader)(nil) // compilatie faalt als het type de interface niet implementeert
Kan de blank identifier worden gebruikt voor permanente onderdrukking van fouten? Is dit een veilige praktijk?
Antwoord: Nee. Hoewel de blank identifier het mogelijk maakt om een fout te negeren, is dit geen veilige praktijk — het onderdrukken van fouten leidt vaak tot fatale bugs of onjuiste werking van het programma. Fouten moeten altijd bewust worden behandeld, en de blank identifier mag alleen op duidelijk begrijpelijke plekken (zoals expliciet onbelangrijke logica) worden gebruikt om ze te onderdrukken.
Verhaal
In een applicatie voor het werken met bestanden gebruikte de ontwikkelaar overal de constructie _, _ = file.Write(...), waarbij hij fouten bij het schrijven negeerde. Als gevolg hiervan bleef het programma 'doorgaan alsof alles goed was' bij een volle schijf of een schrijffout, wat leidde tot gegevensverlies.
Verhaal
In een auditproject dacht de auditor dat als een functie een fout retourneert, deze altijd moest worden onderdrukt (_). Hierdoor werden fouten bij het schrijven van logboeken tijdens het testen niet opgemerkt — belangrijke gegevens gingen verloren en de oorzaak werd niet begrepen.
Verhaal
Een student, die Go aan het leren was, gebruikte een blank identifier bij het importeren van meerdere externe pakketten, hoewel dit helemaal niet nodig was. Hierdoor verdubbelde de grootte van het binaire bestand bijna, omdat alle side effects van de pakketten in de uiteindelijke applicatie waren opgenomen.