🔥 연습문제 - io.Reader

234자
3분

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

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

type MyReader struct{}
 
go

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

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

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

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

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

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

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

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

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

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