사용자 지정 Reader 구현하기
직접 스트림 만들기
사용자 지정 Reader 구현하기은(는) CoddyKit의 무료 Go Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Go Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Go Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
직접 스트림 만들기
메서드 하나만 있는 io.Reader 인터페이스를 구현하여 사용자 지정 데이터 원본을 만들 수 있습니다. 그러면 해당 형식을 모든 io 도우미와 함께 사용할 수 있습니다.
구현해야 할 메서드
사용자 형식에 Read(p []byte) (n int, err error)를 구현하십시오. p를 채우고 개수를 반환한 다음, 작업이 끝나면 io.EOF를 반환하십시오.
상수 읽기 도구
여기서는 같은 바이트를 끝없이 내보내는 읽기 도구를 LimitReader로 제한합니다.
package main
import (
"fmt"
"io"
)
type constReader struct{ ch byte }
func (c constReader) Read(p []byte) (int, error) {
for i := range p {
p[i] = c.ch
}
return len(p), nil
}
func main() {
r := io.LimitReader(constReader{ch: 'A'}, 5)
data, _ := io.ReadAll(r)
fmt.Println(string(data))
}EOF 알리기
데이터 원본을 모두 사용하면 io.EOF를 반환하십시오. io.EOF만 반환해도 되고, 마지막 바이트와 함께 반환해도 됩니다.
package main
import (
"fmt"
"io"
)
type oneShot struct{ done bool }
func (o *oneShot) Read(p []byte) (int, error) {
if o.done {
return 0, io.EOF
}
o.done = true
n := copy(p, []byte("once"))
return n, nil
}
func main() {
data, _ := io.ReadAll(&oneShot{})
fmt.Println(string(data))
}슬라이스에서 읽기
사용자 지정 읽기 도구는 원본 데이터에서 현재 위치를 추적하고, 호출할 때마다 한 덩어리씩 반환할 수 있습니다.
package main
import (
"fmt"
"io"
)
type sliceReader struct {
data []byte
pos int
}
func (s *sliceReader) Read(p []byte) (int, error) {
if s.pos >= len(s.data) {
return 0, io.EOF
}
n := copy(p, s.data[s.pos:])
s.pos += n
return n, nil
}
func main() {
r := &sliceReader{data: []byte("custom")}
out, _ := io.ReadAll(r)
fmt.Println(string(out))
}변환하는 읽기 도구
다른 읽기 도구를 감싸고 바이트를 읽는 즉시 변환할 수 있습니다. 여기서는 스트리밍되는 각 바이트를 대문자로 바꿉니다.
package main
import (
"bytes"
"fmt"
"io"
)
type upper struct{ r io.Reader }
func (u upper) Read(p []byte) (int, error) {
n, err := u.r.Read(p)
for i := 0; i < n; i++ {
if p[i] >= 'a' && p[i] <= 'z' {
p[i] -= 32
}
}
return n, err
}
func main() {
out, _ := io.ReadAll(upper{r: bytes.NewReader([]byte("hello"))})
fmt.Println(string(out))
}버퍼 길이 준수하기
len(p)보다 많은 바이트를 절대 쓰지 마십시오. 더 작은 슬라이스의 길이에 제한되는 copy(p, src)를 사용하고, 복사한 개수를 반환하십시오.
값 수신자와 포인터 수신자
읽기 도구가 위치나 상태를 추적한다면 포인터 수신자를 사용해야 호출 사이에도 변경 내용이 유지됩니다. 상태가 없는 읽기 도구는 값 수신자를 사용할 수 있습니다.
io 도우미와 조합하기
사용자 형식이 io.Reader를 만족하므로 io.Copy, bufio.NewReader, io.LimitReader 등에 별도 작업 없이 바로 연결할 수 있습니다.
package main
import (
"io"
"os"
)
type dots struct{ left int }
func (d *dots) Read(p []byte) (int, error) {
if d.left == 0 {
return 0, io.EOF
}
p[0] = '.'
d.left--
return 1, nil
}
func main() {
io.Copy(os.Stdout, &dots{left: 4})
os.Stdout.WriteString("\n")
}흔한 실수
io.EOF를 반환하지 않음(무한히 읽음)len(p)을 넘어 써 버림- 상태를 유지하는 읽기 도구에 값 수신자를 사용함
사용자 지정 읽기 도구가 필요한 이유
생성기, 디코더, 속도 제한기, 암호화된 스트림 등 어떤 원본이든 범용 Go 입출력 생태계에 연결할 수 있습니다.
빠른 확인
사용자 지정 읽기 도구에 대한 지식을 확인해 보십시오.
복습
직접 스트림을 만드는 방법을 배웠습니다.
Read(p []byte) (int, error)를 구현합니다.copy를 사용하고len(p)을 준수합니다.- 작업이 끝나면
io.EOF를 반환합니다. - 상태를 유지하는 읽기 도구에는 포인터 수신자를 사용합니다.
- 모든 io 도우미와 별도 작업 없이 조합할 수 있습니다.
자주 묻는 질문
“사용자 지정 Reader 구현하기” 강의는 무료인가요?
네 — “사용자 지정 Reader 구현하기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Go Academy 강의 전체를 잠금 해제할 수 있습니다. Go Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“사용자 지정 Reader 구현하기”에서 뭘 배우나요?
직접 스트림 만들기 브라우저에서 직접 실행하는 실습 코드로 Go Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Go Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Go Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“사용자 지정 Reader 구현하기” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Go Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Go Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- Reader 인터페이스
- Writer 인터페이스
- io 유틸리티 함수
- 사용자 지정 Reader 구현하기