🔥 연습문제 - io.Reader
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
함수를 호출하여 MyReader
가 io.Reader
인터페이스를 올바르게 구현했는지 검증해 봅시다.
func main() { reader.Validate(MyReader{}) }
go
reader.Validate
함수는 주어진 io.Reader
를 검증하는 역할을 합니다. 만약 MyReader
가 io.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' 문자로 채우는 간단한 예제였지만, 이를 응용하면 다양한 데이터 소스에서 데이터를 읽어들이는 기능을 구현할 수 있겠죠?