처리 속도는 스트림 방식이 더 낫다. 데이터 크기가 작다면 성능차이를 체감할 수 없지만 비교적 큰 데이터를 다룬다면 스트림 기반의 Encoder/Decoder가 거의 50% 정도 더 빠른 성능을 낸다(출처: Go 언어를 활용한 마이크로서비스 개발 - 에이콘)

type Encoder struct
func NewEncoder(w io.Writer) *Encoder
func (enc *Encoder) Encode(v interface{}) error

type Decoder struct
func NewDecoder(r io.Reader) *Decoder
func (dec *Decoder) Decode(v interface{}) error
type User struct {
   Name string `json:"name"`
   Age  int    `json:"age"`
}

u = User {"Gopher", 7}
enc := json.NewEncoder(os.Stdout).Encode(u)
//===
var u User
dec := json.NewDecoder(os.Stdin).Decode(&u)
fmt.Printf("%+v\\n", u)

/////mapstructure 라이브러리를 사용한 map[string]interface{} => struct 변환

[Go/Golang] Map 자료형을 Struct로 변환하기(mapstructure)

반대로 struct를 map으로 바꾸고 싶을 땐 아래와 같이 해보자

type Environment struct {
	EHR string `default:"<http://localhost:8080/abc>"` //구조체의 기본값을 지정한다.
	CRM string `default:"<http://localhost:8080/ddd>"`
	CSS string `default:"<http://localhost:8080/efe>"`
}

var envMap map[string]interface{}

func (e *Environment) EnvToMap() error {
	envJson, err := json.Marshal(e)
	if err != nil {
		return fmt.Errorf("failed to convert Env to JSON (%s)", err)
	}
	err = json.Unmarshal(envJson, &envMap)
	if err != nil {
		return fmt.Errorf("failed to convert Env to Map (%s)", err)
	}
	return nil
}