0Pricing
Go Academy · 강의

사용자 지정 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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. Reader 인터페이스
  2. Writer 인터페이스
  3. io 유틸리티 함수
  4. 사용자 지정 Reader 구현하기
← Go Academy(으)로 돌아가기