티스토리 뷰

컴퓨터에서 기본적으로 바이트 단위로 데이터를 인식하게 됩니다.

즉 우리가 인식하는 문자가 아니라 숫자 개념으로 모든것을 가지고 인식을 하게 됩니다.

00010001 이렇다고 할까요?

그래서 이것들을 사람들이 알아들을수 있는 개념으로 변경하는것이 decoding, unmarshaling 이라고 합니다.

반대로 사람들이 알아들을수 있는것을 바이트로 변환하는것을 encoding, marshaling  이라고 합니다.

 

golang에서는 이것을 encoding/json 패키지에서 담당을 하게 되는데 이것에 대해서 알아보도록 할게요.

Marshal

구조체 같은 형태의 값을 byte 로 변환하는 작업을 합니다.

json.Marshal에서 이것을 사용 가능합니다.

type User struct {
    Name string
    Age  int
}

user := User{"DH", 100}
bytes, err := json.Marshal(user)

// [123, 111, 122, ...] 예라서 실제 숫자는 아닐거에요.
fmt.Println(bytes)

// {"Name": "DH", "Age": 100}
fmt.Println(string(b))

type은 다른 형태로 만들수가 있는데요.

값을 적어주면 됩니다.

type User struct {
    Name    string `json:"-"` // 출력 안됨
    Age     int    `json:"age, string"` // age: 100으로 노출됨
    Address string `json:"omitempty"` // 값이 비면 출력하지 않음.
}

이것 말고도 많은것들이 있지만 그런 부분들은 찾아보시기 바랍니다.

Encoder

만약에 짧은 데이터를 사용한다면 상관이 없지만 많은 데이터를 처리할 때는 스트림을 사용하는 것이 좋은 방법입니다.

사용하게 되면 Marshaling 하는것과 동일하게 처리가 가능합니다.

type User struct {
    Name string
    Age  int
}

user := User{"DH", 100}
err := json.NewEncoder(os.Stdout).Encode(user) // 표준입력을 넣어줍니다.

Unmarshal

byte로 만들어진 부분을 struct로 만들어주는 역할을 합니다.

var user User
err := json.Unmarshal(response.Body, &user)
// json으로 들어가 있던 byte 값들이 User에 채워지게 됩니다.
fmt.Printf("%+v\n", user)

Decoder

이것도 마찬가지로 Unmarshal data를 stream으로 처리하는것입니다.

var user User
err := json.NewDecoder(response).Decode(user) // response는 network의 *http.Response입니다.
// json으로 들어가 있던 byte 값들이 User에 채워지게 됩니다.
fmt.Printf("%+v\n", user)

response부분은 encoder와 마찬가지로 표준 입력을 넣어주면 됩니다.

 

정리

Marshal, Encoder는 Value type을 byte로 변환

UnMarshal, Decoder는 byte를 Valut type으로 변환하여 줍니다.

 

그러면 Marshal, UnMarshal / Encoder, Decoder의 차이는?

표준 입력출력이 가능하고 자료량이 많은때는 Encoder, Decoder를 이용합니다.

이것은 이점이 있는데 50%정도의 빠른 성능을 보여준다고 합니다.

 

그리고 그것이 아닐때는 Marshal, Unmarshal합니다.

 

Golang는 정말 쉬운거 같습니다.

'Language > Go' 카테고리의 다른 글

Write in go  (0) 2020.07.02
Go. slice에 insert 구현하기  (0) 2020.06.21
Golang으로 아주 간단하게 HTTP 서버 만들기  (1) 2020.03.31
Go. 99Class  (0) 2019.09.16
Go. const와 iota  (0) 2019.09.09
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함