Go's io.Reader-Effizienz: Ein Kampf mit Indirektion und Typ-Assertions
Viele Go-Funktionen verwenden io.Reader als Eingabe, wodurch Streaming ermöglicht und das Laden aller Daten in den Speicher vermieden wird. Wenn man die Bytes jedoch bereits hat, ist deren direkte Verwendung effizienter. Dieser Artikel beschreibt die Erfahrung des Autors beim Dekodieren von Bildern mit libavif und libheif. Aus Gründen der Einfachheit wurden die einfachen Speicherinterfaces verwendet, aber die Go-Funktion image.Decode prüft, ob eine Peek-Funktion in io.Reader vorhanden ist, und packt sie mit bufio.Reader ein, wenn dies nicht der Fall ist, wodurch die direkte Verwendung von bytes.Reader verhindert wird. Der Autor verwendet Typ-Assertions und unsafe.Pointer, um bufio.Reader und bytes.Reader zu umgehen und eine Null-Kopie zu erreichen. Der Artikel hebt jedoch Probleme bei der Typüberprüfung und dem Interface-Design von Go hervor, einschließlich der daraus resultierenden "Shadow APIs".