Reader

  • strings
  • bytes

위 패키지는 string byte 데이터를 처리 하기 위한 패키지 입니다.

원할 한 데이터 처리를 위해 각 패키지는 Reader Buffer 를 제공 합니다.

bytes.Readerstrings.Readerbyte/string 데이터를 io.Reader 입력을 받는 함수에게 데이터를 전달할 때 사용합니다.

본 포스트는 bytes/stringsio 패키지의 인터페이스 구현체 함수들을 보지만, 많은 패키지들이 io 의 인터페이스를 많이 사용하므로, 참고하길 바랍니다.

bytes.Reader

bytes.Readerio 인터페이스들의 구현체로 내부적으로 []byte 타입으로 데이터를 저장 합니다.

func main() {
	targetData := []byte("read me hello world hello how are you")
	byteReader := bytes.NewReader(targetData1)
}

strings.Reader

strings.Reader 또한 io 패키지의 여러 인터페이스의 구현체로 내부적으로 string 타입 데이터를 저장 합니다.

func main() {
	targetData := ("read me hello world hello how are you")
	byteReader := strings.NewReader(targetData)
}

함수

Read(p []byte) (n int, err error)

bytes.Reader 는 기본적으로 io.Reader 의 구현체로 io.Reader 의 기능을 수행할 수 있습니다.

입력받은 슬라이스 p의 길이 만큼 데이터를 읽습니다.

func main() {
	targetData := []byte("read me hello world hello how are you")
	dataReader := bytes.NewReader(targetData)

	b := make([]byte, 5)

	for {
		n, err := dataReader.Read(b)

		fmt.Printf("%d - %s\n", n, b)

		if n < 5 || err != nil {
			break
		}
	}
}
5 - read 
5 - me he
5 - llo w
5 - orld 
5 - hello
5 -  how 
5 - are y
2 - oue y

ReadAt(b []byte, off int64) (n int, err error)

off 위치부터 Reader 를 읽습니다. io.ReaderAt 구현체 입니다. Read 와 달리 offset 을 변경하지 않습니다.

func main() {
	targetData := ("read me hello world hello how are you")
	stringReader := strings.NewReader(targetData)
	// byteReader := bytes.NewBuffer([]byte(targetData))

	b := make([]byte, 6)

	stringReader.ReadAt(b, 10)
	fmt.Printf("%s\n", b)


	stringReader.Read(b)
	fmt.Printf("%s\n", b)
}
llo wo
read m

Seek(offset int64, whence int) (int64, error)

io.Seeker 의 구현체 입니다. Read 함수 등으로 Reader 를 읽으면 읽은 크기만큼 위치(offset)이 변경 됩니다. 이를 수정하기 위한 함수 입니다.

whence 는 다음 값이 사용됩니다.

  • io.SeekStart 처음 위치
  • io.SeekEnd 끝 위치
  • io.SeekCurrent 최근 읽은 위치
func main() {
	targetData := ("read me hello world hello how are you")
	stringReader := strings.NewReader(targetData)

	b := make([]byte, 6)

	stringReader.Read(b)
	fmt.Printf("%s\n", b)

	stringReader.Seek(0, io.SeekStart)

	stringReader.Read(b)
	fmt.Printf("%s\n", b)
}
read m
read m

ReadByte() (byte, error)

Reader 를 1바이트 읽습니다. 만약 EOF 를 만나면 0을 리턴합니다. io.ByteReader 구현체 입니다.

UnreadByte() error

offset 을 1바이트 전으로 옮깁니다. 만약 offset0 일 경우 에러를 리턴 합니다.

func main() {
	targetData := ("read me hello world hello how are you")
	stringReader := strings.NewReader(targetData)

	b := make([]byte, 6)

	stringReader.Read(b)
	fmt.Printf("%s\n", b)

	stringReader.UnreadByte()

	stringReader.Read(b)
	fmt.Printf("%s\n", b)
}
read m
me hel

ReadRune() (ch rune, size int, err error)

rune 한 문자를 읽습니다. io.RuneReader 구현체 입니다.
* rune == byte * 4

UnreadRune() error

rune 한칸 오프셋을 당깁니다. io.RuneScanner 구현체 입니다.

WriteTo(w io.Writer) (n int64, err error)

입력받은 w WriterReader 데이터를 씁니다. io.WriterTo 의 구현체 입니다.

func main() {
	targetData := ("read me hello world hello how are you")
	stringReader := strings.NewReader(targetData)

	f, _ := os.Create("writeThis")

	stringReader.WriteTo(f)
}

writeThis 의 내용

read me hello world hello how are you

Reset

  • Reset(s string)
  • Reset(b []byte)

Reader를 입력한 값으로 리셋 합니다.