이번 글에서는 golang의 기본 모듈인 bytes를 활용하여 어떻게 marshal/unmarshal을 하는지 알아보겠습니다.
hello world라는 문자열을 marshaling할건데 hello와 world 사이에 byte 숫자 0을 집어넣을 것입니다.
그리고 파싱할 때는 0을 구분자로 사용하여 구분자까지만 데이터를 받아오는 예제를 만들어보겠습니다.
(즉, 파싱을 완료하면 world는 볼 수 없겠지요.)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
package main
import (
"bytes"
"fmt"
)
func main() {
b := new(bytes.Buffer)
b.WriteString("hello")
b.WriteByte(0)
b.WriteString("world")
}
|
cs |
buffer는 가변 사이즈를 갖으며 read/write가 가능합니다.
WriteString과 WriteByte 함수를 통해서 문자열을 인자로 받아 처리를 해줄 수도 있고 또는 바로 byte숫자를 받을 수도 있습니다.
보다시피 hello와 world 중간에 byte 0을 넣었습니다.
fmt.Printf("%b\n", b) 로 출력해보면 아래와 같은 결과가 나옵니다.
중간에 0이 잘 들어간걸 확인할 수 있습니다.
1
2
3
4
|
r := bytes.NewBuffer(b.Bytes())
res, _ := r.ReadString(0)
fmt.Println(res)
|
cs |
NewBuffer는 인자로 []byte타입을 받기 때문에 b.Bytes()를 인자로 주었습니다.
그리고 ReadString에 인자인 구분자로 0을 넣어주고 res를 출력해보면 아래와 같이 나옵니다.
world이전에 구분자인 0을 만나게 되어 res는 hello가 담겨있는걸 확인할 수 있습니다.
그런데 ReadString 함수는 구분자까지 포함을 하여 반환하므로 res에는 byte숫자 0도 포함되어 있습니다.
또한, 위 예제에서는 굳이 b.Bytes()를 NewBuffer에 넣지않고 바로 b.ReadString(0)을 통해 읽을 수 있지만 서로 통신한다고 가정을 하고 []byte타입을 가지고 파싱을 할 때의 상황을 가정하여서 NewBuffer함수를 사용해보았습니다.
'golang' 카테고리의 다른 글
Goland undefined 오류 해결하기 (0) | 2021.04.26 |
---|---|
./ 경로 사용시 주의점 (0) | 2021.04.25 |
golang network udp connection 기초 (0) | 2021.04.17 |
Golang network#2 tcp buffer (0) | 2021.04.12 |
golang cancel과 waitGroup 기초 (0) | 2021.04.11 |