: buffered I/O를 이용한 빠른 쓰기 모듈
시스템 내에서 쓰기 작업 (Write)는 운영체제 내에서 시스템 콜 (syscall)중 하나에 속한다. 이는 CPU의 지나친 부하의 원인이 되므로, 자잘한 쓰기 작업 (Write)의 오버헤드를 막기 위해 bufio.Writer를 사용한다.
⇒ 일반적인 Buffer 시스템이 다음과 같이 작동하는 것처럼, GoLang의 bufio.Writer 역시 문자가 바로 최종 목적지로 향하는 것이 아닌, Buffer에 일차적으로 축적되고 그 후 순차적으로 최종 위치에 전송된다.
cf. JAVA의 BufferedWriter, BufferedReader
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
...
bw.flush();
br.close();
bw.close();
}
Producer에서 입력값을 받으면 다음과 같은 경로를 통해 io.Writer에 도달한다.
producer buffer destination (io.Writer)
a -----> a
b -----> ab
c -----> abc
d -----> abcd
e -----> e ------> abcd
f -----> ef abcd
g -----> efg abcd
h -----> efgh abcd
i -----> i ------> abcdefgh
: 데이터들을 배치 단위로 분할한 후에 각 Consumer에서 읽고자 하는 문자들을 입력 받는다.
abcd -----> abcd -----> a
abcd -----> b
abcd -----> c
abcd -----> d
efgh -----> efgh -----> e
efgh -----> f
efgh -----> g
efgh -----> h
ijkl -----> ijkl -----> i
ijkl -----> j
⇒ “abcdefghijkl”이라는 문자열이 있고 이를 앞에서 10글자까지만 읽고자 할 때, 원래라면 총 읽기 작업은 10번 수행된다. 이 때 전체 문자열을 다 가져오는 것이 아닌, 일정 배치 단위로 분할한 후에 부분적으로 읽고자 하는 데이터를 읽는다.
따라서 abcd, efgh, ijkl로 분할한 후에, 각 분할한 부분에서 순서대로 읽는다. 따라서 최종적으로 디스크에서 수행되는 읽기 작업은 총 3번 밖에 되지 않는다.
:Golang은 기본적으로 c++이나 python과 달리 열거형 타입을 지원하지 않는다. 그러나 enum의 목적은 우Mapping을 달성할 수 있다.