[golang] 구조체를 맵 [string]interface {}로 변환

개시하다


제스처로 맵[string]interface {}을 만드는 것이 게으르다고 생각해서 구조체에서 자동으로 생성할 수 있는 방법을 찾아봤어요.
UnexportedField 이외의 요소로 맵을 만드는 부분은 힘들다.
또 구조체가 중첩된 경우도 힘들다.

json.마사하르와 제이슨.Unmarshal 활용


결론부터 말하자면, 우리의 방법으로 해결한 것이다.
서술을 시작했는데, 고생한 2시가 능숙해졌다.
코드는 다음과 같습니다.
struct.go
type PrimaryID struct {
	ID     int32  `json:"-"`
	HashID string `json:"hash_id"`
}
type User struct {
	tableName struct{}
	PrimaryID
	Name string `json:"name"`
}
json.go
func StructToJsonTagMap(data interface{}) (map[string]interface{}, error) {
	jsonStr, err := json.Marshal(data)
	if err != nil {
		return nil, err
	}
	out := new(bytes.Buffer)
	// JSONの整形
	err = json.Indent(out, jsonStr, "", "    ")
	if err != nil {
		return nil, err
	}
	var mapData map[string]interface{}
	if err := json.Unmarshal([]byte(out.String()), &mapData); err != nil {
		return nil, err
	}
	return mapData, err
}

[WIP] 구조체에서 맵 [string]interface {} 직접 만들기


나도 할 수 있을 텐데, 포기했어.
끼워 넣은 구조체로 맵을 만들 수 있는 사람???
댓글로 알려주시면 좋겠네요.
json.go
func StructToJsonTagMap(data interface{}) map[string]interface{} {
	result := make(map[string]interface{})
	elem := reflect.ValueOf(data).Elem()
	size := elem.NumField()
	//最初はテーブル名のため i=1から
	for i := 1; i < size; i++ {
		field := elem.Type().Field(i).Tag.Get("json")
		if field == "-" {
			continue
		}
		value := elem.Field(i).Interface()
		result[field] = value
	}
	return result
}

[WIP]에서 키를 지정하지 않은 경우


json.go
func StructToMap(data interface{}) map[string]interface{} {
	result := make(map[string]interface{})
	elem := reflect.ValueOf(data).Elem()
	size := elem.NumField()

	for i := 0; i < size; i++ {
		field := elem.Type().Field(i).Name
		value := elem.Field(i).Interface()
		result[field] = value
	}
	return result
}

컨디션

  • MacBook Air (M1, 2020)
  • go -v 1.15
  • echo -v 4.3.0
  • Docker version 20.10.8, build 3967b7d
  • docker-compose version 1.29.2, build 5becea4c
  • 참고 자료

  • https://noknow.info/it/go/how_to_convert_between_map_string_interface_and_json_string?lang=ja#sec2
  • https://qiita.com/hnaohiro/items/1f021fa5e703b5a530cf
  • https://qiita.com/keitaj/items/440a50a53c8980ee338f
  • https://go.dev/blog/laws-of-reflection
  • 좋은 웹페이지 즐겨찾기