🔥 연습문제 - io.Reader

234자
3분

Go 언어에서는 io.Reader 인터페이스를 통해 데이터를 읽어들이는 기능을 추상화하고 있습니다. 이번에는 io.Reader 인터페이스를 직접 구현하여 주어진 바이트 슬라이스를 'A' 문자로 채우는 MyReader 타입을 만들어 보겠습니다.

먼저, MyReader 구조체를 정의합니다.

go
type MyReader struct{}
 
go
type MyReader struct{}
 

MyReader 구조체는 아무런 필드도 가지고 있지 않습니다. 단순히 io.Reader 인터페이스를 구현하기 위한 타입으로 사용됩니다.

다음으로, MyReader 타입에 Read 메서드를 추가합니다.

go
func (r MyReader) Read(b []byte) (int, error) {
    for i := range b {
        b[i] = 'A' // 버퍼의 모든 바이트를 'A'로 채웁니다.
    }
    return len(b), nil // 채운 바이트 수와 nil 에러를 반환합니다.
}
 
go
func (r MyReader) Read(b []byte) (int, error) {
    for i := range b {
        b[i] = 'A' // 버퍼의 모든 바이트를 'A'로 채웁니다.
    }
    return len(b), nil // 채운 바이트 수와 nil 에러를 반환합니다.
}
 

Read 메서드는 io.Reader 인터페이스에서 정의한 메서드로, 주어진 바이트 슬라이스 b에 데이터를 채워넣는 역할을 합니다. 여기서는 b의 모든 바이트를 'A' 문자로 채우고, 채운 바이트 수와 nil 에러를 반환합니다.

이제 main 함수에서 reader.Validate 함수를 호출하여 MyReaderio.Reader 인터페이스를 올바르게 구현했는지 검증해 봅시다.

go
func main() {
    reader.Validate(MyReader{})
}
 
go
func main() {
    reader.Validate(MyReader{})
}
 

reader.Validate 함수는 주어진 io.Reader를 검증하는 역할을 합니다. 만약 MyReaderio.Reader 인터페이스를 올바르게 구현했다면, 프로그램은 아무런 출력 없이 정상적으로 종료될 것입니다.

완성된 코드는 다음과 같습니다.

go
package main
 
import "golang.org/x/tour/reader"
 
type MyReader struct{}
 
func (r MyReader) Read(b []byte) (int, error) {
    for i := range b {
        b[i] = 'A'
    }
    return len(b), nil
}
 
func main() {
    reader.Validate(MyReader{})
}
 
go
package main
 
import "golang.org/x/tour/reader"
 
type MyReader struct{}
 
func (r MyReader) Read(b []byte) (int, error) {
    for i := range b {
        b[i] = 'A'
    }
    return len(b), nil
}
 
func main() {
    reader.Validate(MyReader{})
}
 

이 예제를 통해 io.Reader 인터페이스를 직접 구현하여 사용자 정의 타입으로 데이터를 읽어들이는 방법을 배웠습니다. MyReader는 주어진 바이트 슬라이스를 'A' 문자로 채우는 간단한 예제였지만, 이를 응용하면 다양한 데이터 소스에서 데이터를 읽어들이는 기능을 구현할 수 있겠죠?

YouTube 영상

채널 보기
NestJS 역할 기반 접근 권한 부여 - Guard, Reflector | NestJS 가이드
변환 파이프로 컨트롤러 코드 깔끔하게 만들기 | NestJS 가이드
NestJS 커스텀 데코레이터 인자 전달 및 파이프 검증 활용법 | NestJS 가이드
API 응답 지연과 복잡한 에러, NestJS 인터셉터로 관리하는 방법 | NestJS 가이드
미들웨어 vs 가드, 왜 NestJS에서는 가드가 더 똑똑할까? | NestJS 가이드
관점 지향 로깅 인터셉터 구현 및 전역 바인딩 전략 | NestJS 가이드
입력을 전처리하는 Functor - Contravariant와 contramap 이해하기 | 프로그래머를 위한 카테고리 이론
NestJS 커스텀 데코레이터, createParamDecorator 사용 | NestJS 가이드