Eficiencia de io.Reader en Go: Una batalla con indirección y afirmaciones de tipo
Muchas funciones en Go usan io.Reader como entrada, permitiendo la transmisión por secuencias y evitando cargar todo en la memoria. Sin embargo, cuando ya tienes los bytes, usarlos directamente es más eficiente. Este artículo describe la experiencia del autor decodificando imágenes con libavif y libheif. Por simplicidad, se usaron las interfaces de memoria simples, pero la función image.Decode de Go comprueba si hay una función Peek en io.Reader, envolviéndola con bufio.Reader si no se encuentra, lo que impide el uso directo de bytes.Reader. El autor usa afirmaciones de tipo y unsafe.Pointer para evitar bufio.Reader y bytes.Reader, logrando copia cero. Sin embargo, el artículo destaca problemas en la comprobación de tipos y en el diseño de interfaces de Go, incluyendo las 'APIs shadow' resultantes.