Reader
- strings
- bytes
위 패키지는 string
byte
데이터를 처리 하기 위한 패키지 입니다.
원할 한 데이터 처리를 위해 각 패키지는 Reader
Buffer
를 제공 합니다.
bytes.Reader
와 strings.Reader
는 byte
/string
데이터를 io.Reader
입력을 받는 함수에게 데이터를 전달할 때 사용합니다.
본 포스트는 bytes
/strings
의 io
패키지의 인터페이스 구현체 함수들을 보지만, 많은 패키지들이 io
의 인터페이스를 많이 사용하므로, 참고하길 바랍니다.
bytes.Reader
bytes.Reader
는 io
인터페이스들의 구현체로 내부적으로 []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바이트 전으로 옮깁니다. 만약 offset
이 0
일 경우 에러를 리턴 합니다.
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
Writer
에 Reader
데이터를 씁니다. 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
를 입력한 값으로 리셋 합니다.