🍳머리말
Marshal과 Unmarshal함수에 대해 설명한 글입니다.
📕Marshal
📔 정의
data를 다른 program이 인식할 수 있는 형태로 적합하게 변형하는 것입니다. 이를 수행하면 예를 들어, 서로 떨어진 객체끼리의 통신을 위해 string 또는 int 등 여러 자료형으로 표현된 data를 byte값으로 변형해 전송할 수 있게 됩니다.
📔 go에서 Marshal 함수
func Marshal(v interface{}) ([]byte, error)
go에서는 mashal함수의 인자로 정수형, 구조체 type이 들어가며, byte list 반환값을 가지게 됩니다.
📘 예시
*struct의 key값을 대문자로 써야합니다. 그렇지 않다면 string으로 변환하는 과정에서 공백을 출력하게 됩니다.
package main
import (
"encoding/json"
"fmt"
)
type Info struct {
Stmt string
Num int
}
func main() {
var i = Info{"WHY", 1}
bytes, _ := json.Marshal(i);
bytes2, _ := json.Marshal(true);
fmt.Println(bytes) //[123 34 83 116 109 116 34 58 34 87 72 89 34 44 34 78 117 109 34 58 49 125]
fmt.Println(bytes2) //[116 114 117 101]
fmt.Println(string(bytes)) //{"Stmt":"WHY","Num":1}
fmt.Println(string(bytes2)) //"true"
}
struct type을 정의 시 tag를 이용하면 property를 바꿀 수 있습니다. Json 형태의 data를 변형해 출력가능함을 의미합니다. tag는 '(back slash)로 감싸 표현합니다. 다음은 json을 marshaling시 key값을 소문자로 변환토록 tag를 지정한 예시입니다.
📘 예시
package main
import (
"encoding/json"
"fmt"
)
type Info struct {
Stmt string `json:"stmt"`
Num int `json:"age"`
}
func main() {
var i = Info{"WHY", 1}
bytes, _ := json.Marshal(i);
fmt.Println(bytes) //[123 34 83 116 109 116 34 58 34 87 72 89 34 44 34 78 117 109 34 58 49 125]
fmt.Println(string(bytes)) //{"stmt":"WHY","age":1}
}
다음처럼 특정 값을 출력하지 않도록 할 수 있습니다.
📘 예시
package main
import (
"encoding/json"
"fmt"
)
type Info struct {
Stmt string `json:"-"`
Num int `json:"age"`
}
func main() {
var i = Info{"WHY", 1}
bytes, _ := json.Marshal(i);
fmt.Println(bytes) //[123 34 83 116 109 116 34 58 34 87 72 89 34 44 34 78 117 109 34 58 49 125]
fmt.Println(string(bytes)) //{"age":1}
}
📔 go에서 MarshalIndent 함수
func MarshalIndent(v interface{}, prefix, indent string) ([]byte, error)
data 가독성을 위해 해당함수를 지원합니다.
📘 예시
package main
import (
"encoding/json"
"fmt"
)
type Info struct {
Stmt string `json:"-"`
Num int `json:"age"`
}
func main() {
var i = Info{"WHY", 1}
bytes, _ := json.MarshalIndent(i, "", " ");
fmt.Println(bytes) //[123 34 83 116 109 116 34 58 34 87 72 89 34 44 34 78 117 109 34 58 49 125]
fmt.Println(string(bytes))
/*
{
"age": 1
}
*/
}
📕 Unmarshal
📔 정의
Marshal과 반대 개념입니다. byte list나 string을 논리적 자료구조로 decoding하는 것 입니다.
📔 go에서 Unmarshal
func Unmarshal(data []byte, v interface{}) error
첫 번째 인자로 byte list를 두 번째 인자로 받을 변수의 주소값을 넘겨줍니다.
📘 예시
package main
import (
"encoding/json"
"fmt"
)
func main() {
var i bool
json.Unmarshal([]byte("true"), &i)
fmt.Println(i) //true
}
다음처럼 json문자열을 unmarshal할 수도 있습니다.
📘 예시
package main
import (
"encoding/json"
"fmt"
)
type Info struct {
Stmt string
Num int
}
func main() {
var i = `{"Stmt" : "WHY", "Num" : 1}`
var j Info
json.Unmarshal([]byte(i), &j)
fmt.Printf("%+v", j)
}
값이 구조체인 경우, %+v 변형은 구조체의 필드명까지 포함합니다.
'Go' 카테고리의 다른 글
(Go error) - missing go.sum entry for module providing package <package_name> (0) | 2022.08.23 |
---|---|
(Go) - Window에 go 설치 및 환경설정 (0) | 2022.08.19 |
(client-go Error) - "but does not contain package k8s.io/api/auditregistration/v1alpha1" (0) | 2022.08.12 |
(Go) - go get과 go mod download 차이 (0) | 2022.08.11 |
(Go) - test하기 (0) | 2022.05.03 |