Una de las características inusuales de Go es que las funciones y métodos pueden devolver múltiples valores. Estea tecnica se puede utilizar para mejorar un par de modismos torpes en programas C: retornos de error dentro de banda como -1 para EOF y modificación de un argumento pasado por dirección.
En C, un error de escritura se indica mediante un recuento negativo con el código de error escondido en un lugar volátil. En Go, Write puede devolver un recuento y un error: “Sí, escribiste algunos bytes pero no todos porque llenaste el dispositivo”. La firma del método Write en archivos del paquete os es:
func (file *File) Write(b []byte) (n int, err error)
y como dice la documentación, devuelve el número de bytes escritos y un error no nulo cuando n! = len(b).
Un enfoque similar evita la necesidad de pasar un puntero a un valor de retorno para simular un parámetro de referencia. Aquí hay una función simple para tomar un número de una posición en un segmento de bytes, devolviendo el número y la siguiente posición.
func nextInt(b []byte, i int) (int, int) {
for ; i < len(b) && !isDigit(b[i]); i++ {
}
x := 0
for ; i < len(b) && isDigit(b[i]); i++ {
x = x*10 + int(b[i]) - '0'
}
return x, i
}
Podrías usarlo para escanear los números en un segmento de entrada b como este:
for i := 0; i < len(b); {
x, i = nextInt(b, i)
fmt.Println(x)
}