package gob
import (
"bytes"
"encoding/gob"
)
func Marshal(v interface{}) ([]byte, error) {
buffer := bytes.NewBuffer([]byte{})
if err := gob.NewEncoder(buffer).Encode(v); err != nil {
return nil, err
}
return buffer.Bytes(), nil
}
func Unmarshal(v []byte, dest interface{}) error {
buffer := bytes.NewBuffer(v)
return gob.NewDecoder(buffer).Decode(dest)
}
주의: export 되지 않은 필드 (필드명이 대문자로 시작하지 않는 필드) 는 복사되지 않음
테스트 코드
package gob
import (
"errors"
"testing"
)
func TestMarshal(t *testing.T) {
type Lion struct {
Name string
}
lion := &Lion{Name: "hello"}
if _, err := Marshal(lion); err != nil {
t.Error(err.Error())
}
}
func TestUnmarshal(t *testing.T) {
type Lion struct {
Name string
}
lion1 := &Lion{Name: "hello"}
lionBytes, err := Marshal(lion1)
if err != nil {
t.Error(err.Error())
}
lion2 := new(Lion)
if err := Unmarshal(lionBytes, lion2); err != nil {
t.Error(err.Error())
return
}
if lion1.Name != lion2.Name {
t.Error(errors.New("invalid name value"))
}
}
정보가 많아서 도움이 많이 됐습니다.