maputil

package
v1.1.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 1, 2026 License: MIT Imports: 8 Imported by: 0

Documentation

Overview

Package maputil 맵(Map) 데이터 처리 및 구조체 변환을 위한 유틸리티 기능을 제공합니다.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func Decode

func Decode[T any](input any, opts ...Option) (*T, error)

Decode 입력된 맵(Map)이나 인터페이스 데이터를 지정된 제네릭 타입 T의 구조체로 변환하여 반환합니다.

내부적으로 `mapstructure` 라이브러리를 활용하며, 안전하고 유연한 디코딩을 위한 기본 설정이 적용되어 있습니다. 필요에 따라 `Option` 함수들을 가변 인자로 전달하여 동작 방식을 세밀하게 제어할 수 있습니다.

[주요 특징 및 기본 동작]

  • 유연한 타입 변환 (Weakly Typed): "123" -> 123 (int), 1 -> true (bool) 등 타입을 자동으로 보정합니다.
  • 구조체 평탄화 (Squash): 임베디드 구조체를 자동으로 평탄화하여 상위 맵 필드와 매핑합니다.
  • 태그 지원: 기본적으로 구조체의 `json` 태그를 기준으로 필드를 매핑합니다.
  • 고급 타입 지원: `[]byte` ("base64:" 접두사 필요), `time.Duration`, `net.IP` 등을 위한 전용 훅이 내장되어 있습니다.

[주의사항] 기본적으로 `ErrorUnused` 옵션이 꺼져 있습니다 (`false`). 따라서 구조체에 정의되지 않은 필드가 입력 데이터에 포함되어 있어도 에러 없이 무시됩니다.

[사용 예시]

// 기본 사용
cfg, err := maputil.Decode[MyConfig](inputMap)

// 옵션 적용 (엄격한 검증)
cfg, err := maputil.Decode[MyConfig](inputMap,
    maputil.WithErrorUnused(true),
    maputil.WithTagName("yaml"),
)

func DecodeTo

func DecodeTo[T any](input any, output *T, opts ...Option) error

DecodeTo 입력된 데이터를 대상 구조체 포인터(output)에 디코딩하여 값을 채웁니다.

[제약 사항] output 인자는 반드시 `nil`이 아닌 포인터여야 합니다. (Run-time Panic 방지)

[동작 방식]

  1. Merge Semantics (기본 동작): 기존 output 구조체에 값이 있다면 유지하며, 입력 데이터와 병합(Merge)합니다. 완전한 초기화 후 디코딩(Replace)을 원한다면 `WithZeroFields(true)` 옵션을 사용하십시오.

  2. Recursive Structures: 순환 참조(Cyclic Reference)가 포함된 입력 데이터는 무한 루프를 유발할 수 있으므로 주의가 필요합니다.

Types

type Option

type Option func(*decodingConfig)

Option 디코딩 설정을 커스터마이징하기 위한 함수형 옵션 타입입니다.

func WithDecodeHook

func WithDecodeHook(hooks ...mapstructure.DecodeHookFunc) Option

WithDecodeHook 기본 제공되는 변환 로직 외에 사용자 정의 변환 훅(Hook)을 추가합니다.

여러 개의 훅을 추가할 수 있으며, 추가된 훅들은 기본 훅보다 먼저 실행되어 커스텀 변환 로직을 우선 적용합니다.

func WithErrorUnused

func WithErrorUnused(enable bool) Option

WithErrorUnused 대상 구조체에 없는 필드가 입력 데이터에 존재할 경우, 무시하지 않고 에러를 발생시킵니다. (기본값: false)

오타 등으로 인해 의도치 않게 설정이 누락되는 것을 방지하기 위해 엄격한 검증이 필요할 때 유용합니다.

func WithMatchName

func WithMatchName(matchFunc func(mapKey, fieldName string) bool) Option

WithMatchName 필드 이름과 입력 키를 매칭하는 로직을 커스터마이징합니다.

기본 동작은 대소문자를 구분하지 않고 매칭하는 것입니다. 이를 변경하여 대소문자를 구분하거나 특수한 매칭 규칙을 적용할 수 있습니다.

func WithMetadata

func WithMetadata(md *mapstructure.Metadata) Option

WithMetadata 디코딩 과정에서 사용된 키(Keys)나 사용되지 않은 키(Unused) 등의 메타데이터를 수집합니다.

디코딩 결과에 대한 상세한 분석이 필요할 때 유용합니다.

func WithSquash

func WithSquash(enable bool) Option

WithSquash 임베디드 구조체(Embedded Struct)를 평탄화(Flattening)하여 처리할지 설정합니다. (기본값: true)

true로 설정하면, 중첩된 맵 구조를 따르지 않고 상위 레벨의 맵 필드를 임베디드 구조체의 필드에 직접 매핑합니다.

func WithTagName

func WithTagName(tagName string) Option

WithTagName 구조체 필드 매핑에 사용할 태그 이름을 지정합니다. (기본값: "json")

"json" 대신 "yaml", "toml" 등의 태그를 기준으로 매핑하려면 이 옵션을 사용하십시오.

func WithTrimSpace

func WithTrimSpace(enable bool) Option

WithTrimSpace 콤마(,)로 구분된 문자열을 슬라이스로 변환할 때, 각 요소의 앞뒤 공백을 자동으로 제거할지 설정합니다. (기본값: true)

예: "a, b" 입력 시

  • true(활성, 기본값): ["a", "b"] (깔끔한 데이터)
  • false(비활성): ["a", " b"] (공백 유지)

func WithWeaklyTypedInput

func WithWeaklyTypedInput(enable bool) Option

WithWeaklyTypedInput 타입이 달라도 가능한 경우 자동으로 변환(Weakly Typed)할지 설정합니다. (기본값: true)

예시 (활성화 시):

  • "123" (string) -> 123 (int) : 문자열을 숫자로 자동 변환
  • 1 (int) -> true (bool) : 0이 아닌 숫자를 true로 변환
  • []string{"val"} -> "val" (string) : 단일 요소 슬라이스를 값으로 변환

func WithZeroFields

func WithZeroFields(enable bool) Option

WithZeroFields 디코딩 전에 대상 구조체의 모든 필드를 제로 값(Zero Value)으로 초기화할지 설정합니다.

true로 설정하면, 구조체에 미리 설정된 기본값들을 모두 지우고 입력 데이터에 있는 값으로만 채웁니다. 즉, 덮어쓰기(Merge)가 아니라 교체(Replace) 방식으로 동작하게 됩니다.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL