저작권 안내
- 책 또는 웹사이트의 내용을 복제하여 다른 곳에 게시하는 것을 금지합니다.
- 책 또는 웹사이트의 내용을 발췌, 요약하여 강의 자료, 발표 자료, 블로그 포스팅 등으로 만드는 것을 금지합니다.
입출력 인터페이스 사용하기
이재홍 http://www.pyrasis.com 2014.12.17 ~ 2015.02.07
읽기, 쓰기 인터페이스를 함께 사용하기
지금까지 io.Reader, io.Writer를 각각 따로 사용했는데 이번에는 io.ReadWriter 인터페이스로 읽기/쓰기를 처리해보겠습니다.
io.ReadWriter의 정의는 다음과 같습니다.
type ReadWriter interface {
Reader
Writer
}
즉, io.ReadWriter 인터페이스는 io.Reader, io.Writer 인터페이스를 포함(임베딩)하고 있습니다.
다음은 bufio 패키지에서 제공하는 입출력 인터페이스 함수입니다.
- func (b *Reader) ReadLine() (line []byte, isPrefix bool, err error): io.Reader에서 문자열 한 줄을 읽어서 바이트 슬라이스로 리턴
이제 io.ReadWriter 인터페이스를 사용하여 파일에 문자열을 쓴 뒤 다시 읽어보겠습니다.
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
file, err := os.OpenFile(
"hello.txt",
os.O_CREATE|os.O_RDWR|os.O_TRUNC, // 파일이 없으면 생성,
// 읽기/쓰기, 파일을 연 뒤 내용 삭제
os.FileMode(0644)) // 파일 권한은 644
if err != nil {
fmt.Println(err)
return
}
defer file.Close() // main 함수가 끝나기 직전에 파일을 닫음
r := bufio.NewReader(file) // file로 io.Reader 인터페이스를 따르는 읽기 인스턴스 r 생성
w := bufio.NewWriter(file) // file로 io.Writer 인터페이스를 따르는 쓰기 인스턴스 w 생성
rw := bufio.NewReadWriter(r, w) // r, w를 사용하여 io.ReadWriter 인터페이스를 따르는
// 읽기/쓰기 인스턴스 생성
rw.WriteString("Hello, world!") // 읽기/쓰기 인스턴스로 버퍼에 Hello, world! 쓰기
rw.Flush() // 버퍼의 내용을 파일에 저장
file.Seek(0, os.SEEK_SET) // 파일 읽기 위치를 파일의 맨 처음(0)으로 이동
data, _, _ := rw.ReadLine() // 파일에서 문자열 한 줄을 읽어서 data에 저장
fmt.Println(string(data)) // 문자열로 변환하여 data의 내용 출력
}
bufio.NewReader, bufio.NewWriter 함수를 사용하여 io.Reader, io.Writer 인터페이스를 따르는 읽기, 쓰기 인스턴스를 생성합니다. 그리고 bufio.NewReadWriter 함수에 읽기, 쓰기 인스턴스를 넣으면 io.ReadWriter 인터페이스를 따르는 읽기/쓰기 인스턴스가 생성됩니다.
읽기/쓰기 인스턴스의 WriteString으로 버퍼에 문자열을 쓴 뒤 버퍼의 내용을 파일에 저장합니다. 그 다음에는 파일의 읽기 위치를 맨 앞으로 이동하고, 읽기/쓰기 인스턴스의 ReadLine으로 파일에서 문자열 한 줄을 읽습니다.
이처럼 io.ReadWriter 인터페이스를 사용하면 읽기 및 쓰기 동작을 인스턴스 한 개로 처리할 수 있습니다.
저작권 안내
이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.- 블로그, 게시판 등에 퍼가는 것을 금지합니다.
- 비공개 포스트에 퍼가는 것을 금지합니다.
- 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
- 링크 및 SNS 공유는 허용합니다.