Go의 io.Reader 효율성: 간접 참조와 형식 어서션과의 싸움
2025-05-19
Go의 많은 함수는 io.Reader 인터페이스를 입력으로 받습니다. 이를 통해 스트리밍이 가능해지고 모든 데이터를 메모리에 로드할 필요가 없습니다. 하지만 이미 바이트 데이터를 가지고 있는 경우, 이를 직접 사용하는 것이 더 효율적입니다. 이 글에서는 저자가 libavif와 libheif를 사용하여 이미지를 디코딩했을 때의 경험을 설명합니다. 간결성을 위해 간단한 메모리 인터페이스를 사용했지만, Go의 image.Decode 함수는 io.Reader에서 Peek 함수의 유무를 확인하고, 없으면 bufio.Reader로 래핑하기 때문에 bytes.Reader의 바이트를 직접 사용할 수 없습니다. 저자는 형식 어서션과 unsafe.Pointer를 사용하여 bufio.Reader와 bytes.Reader를 우회하고 제로 카피를 달성했습니다. 하지만 이 글에서는 Go의 형식 검사와 인터페이스 설계의 문제점, 그리고 그 결과 발생하는 “섀도우 API”에 대해서도 지적하고 있습니다.
개발