JSON 인코딩을 사용하여 동일한 구조의 필드 병합
Go 프로그래밍 영역에서 동일한 구조의 두 구조 필드를 병합하는 작업 유형이 자주 발생합니다. 다음과 같은 기본 구성이 있고 다음과 같은 파일에서 로드된 구성이 있는 시나리오를 생각해 보십시오.
type Config struct { path string id string key string addr string size uint64 } var DefaultConfig = Config{"", "", "", "", 0}
목표는 이 두 구성을 병합하는 것입니다. 결과는 두 구조체의 값을 모두 가지게 되며 FileConfig는 DefaultConfig의 모든 값을 덮어씁니다. 그러나 FileConfig에는 모든 필드가 포함되지 않을 수 있습니다.
var FileConfig = Config{"", "file_id", "", "file_addr", 0}
그러나 이 경우 리플렉션은 최적의 솔루션이 아닙니다. 보다 우아한 접근 방식은 인코딩/json 패키지의 기능을 활용하는 것입니다.
func merge(default *Config, file *Config) (*Config) { b := reflect.ValueOf(default).Elem() o := reflect.ValueOf(file).Elem() for i := 0; i < b.NumField(); i++ { defaultField := b.Field(i) fileField := o.Field(i) if defaultField.Interface() != reflect.Zero(fileField.Type()).Interface() { defaultField.Set(reflect.ValueOf(fileField.Interface())) } } return default }
이 솔루션에서는 fileConfig가 기본 구성으로 마샬링 해제됩니다. 인코딩/json 패키지는 누락된 값(기본값은 0 값임) 및 기본값을 재정의하는 파일 지정 값을 포함하여 필드 값 설정의 모든 복잡성을 처리합니다.
import ( "encoding/json" "strings" ) const fileContent = `{"id":"file_id","addr":"file_addr","size":100}` func unmarshalConfig(conf *Config, content string) error { return json.NewDecoder(strings.NewReader(content)).Decode(conf) } func mergeConfigs(defConfig *Config, fileConfig *Config) error { if err := unmarshalConfig(defConfig, fileContent); err != nil { return err } for _, v := range fileConfig { defConfig[v.key] = v.value } return nil }
위 내용은 JSON 인코딩을 사용하여 동일한 유형의 Go 구조체를 효율적으로 병합하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!