본문 바로가기
golang

golang network bytes함수를 이용한 marshal/unmarshal

by PudgeKim 2021. 4. 18.

이번 글에서는 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