Buenas! En la actualidad el GOTO es un feature que esta en varios lenguajes ( Incluso en Java O.o ) y que tiene un gran dilema. Por un lado puede simplificar algunas cosas y por otro lado puede hacer que nuestro código se vuelve mas difícil de seguir. Hace unos días estaba mirando un cacho de código del Kernel de Linux y justamente una de las cosas que había notado era el uso de GOTO.
Encontré una pagina donde citaban ese código del Kernel y mostraban unos ejemplos de uso del GOTO en base a ese código:
typedef struct object { // A generic struct -- The contents don't matter
int propertyA, propertyB, propertyC;
errno_t do_something(void){
fin1 = fopen("some_file", "r");
fin2 = fopen("some_other_file", "r");
obj = malloc(sizeof(object_t));
return ret_val; // forgot to close fin2 !!
Este código como se puede ver, puede resultar algo repetitivo y molesto. Una solución usando GOTO seria:
// ... assume the same struct as above ...
errno_t do_something(void) {
errno_t ret_val = NOERR; // Initially assume a successful return value
fin1 = fopen("some_file", "r");
fin2 = fopen("some_other_file", "r");
obj = malloc(sizeof(object_t));
SUCCESS: // Clean up everything
FAIL_OBJ: // Otherwise, close only the resources we opened
A mi criterio, algo así esta permitido siempre y cuando la función no sea grande, el GOTO sean a etiquetas dentro de la función y sea una situación con las mismas características que estos ejemplos se mostró.