Eficiência do io.Reader em Go: Uma Batalha com Indireção e Asserções de Tipo
Muitas funções em Go utilizam io.Reader como entrada, permitindo streaming e evitando carregar tudo na memória. No entanto, quando você já possui os bytes, usá-los diretamente é mais eficiente. Este artigo descreve a experiência do autor decodificando imagens com libavif e libheif. Por simplicidade, foram usadas as interfaces de memória simples, mas a função image.Decode do Go verifica se há uma função Peek no io.Reader, encapsulando com bufio.Reader se não encontrada, impedindo o uso direto de bytes.Reader. O autor usa asserções de tipo e unsafe.Pointer para contornar bufio.Reader e bytes.Reader, alcançando cópia zero. No entanto, o artigo destaca problemas na verificação de tipo e no design de interface do Go, incluindo as 'APIs shadow' resultantes.