Reflection 또는 JSON Unmarshalling을 사용하여 동일한 유형의 구조체 병합
Go에서는 두 구조체를 병합해야 하는 시나리오가 발생할 수 있습니다. 한 구조체의 값이 잠재적으로 다른 구조체의 값을 재정의하는 동일한 유형입니다. 이 기사에서는 이를 달성하기 위한 두 가지 접근 방식, 즉 Go의 반사 기능을 사용하거나 JSON 데이터를 준비된 기본 구성으로 역마샬링하는 방법을 살펴봅니다.
반사 접근 방식(권장하지 않음)
반사 접근 방식 , 아래 제시된 것처럼 재정의할 필드를 결정하려면 0 값을 확인해야 합니다. 그러나 이 솔루션은 다음과 같은 이유로 이상적이지 않습니다.
<br>func merge(default <em>Config, file </em>Config) (*Config) {<br> b := 반영. ValueOf(기본값).Elem()<br> o := Reflect.ValueOf(file).Elem()</p> <p>i용 := 0; 나는 < b.넘버필드(); i {</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">defaultField := b.Field(i) fileField := o.Field(i) if defaultField.Interface() != reflect.Zero(fileField.Type()).Interface() { defaultField.Set(reflect.ValueOf(fileField.Interface())) }
}
return default
}
JSON 언마샬링 접근 방식(권장)
더 우아하고 유연한 접근 방식은 Go의 인코딩/json 패키지를 사용하고 JSON을 비정렬화하는 것입니다. 데이터를 준비된 기본 구성으로 변환합니다. 이 방법은 여러 가지 장점을 제공합니다.
이를 보여주기 위해 접근 방식:
예제 코드:
var defConfig = &Config{ S1: "", S2: "", S3: "abc", S4: "def", S5: "ghi", } const fileContent = `{"S2":"file-s2","S3":"","S5":"file-s5"}` err := json.NewDecoder(strings.NewReader(fileContent)).Decode(defConfig) if err != nil { panic(err) }
이 솔루션을 사용하면 기본 구성의 값을 덮어쓰게 됩니다. 파일 구성의 값을 사용하여 동일한 유형의 구조체를 병합하는 안정적이고 유연한 방법을 제공합니다.
위 내용은 동일한 유형의 두 Go 구조체를 효율적으로 병합하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!