> 백엔드 개발 > Golang > 동일한 유형의 두 Go 구조체를 효율적으로 병합하려면 어떻게 해야 합니까?

동일한 유형의 두 Go 구조체를 효율적으로 병합하려면 어떻게 해야 합니까?

Linda Hamilton
풀어 주다: 2024-12-21 13:56:09
원래의
818명이 탐색했습니다.

How Can I Efficiently Merge Two Go Structs of the Same Type?

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
}

  • reflection에 의존하므로 비효율적일 수 있음 오류가 발생하기 쉽습니다.
  • 기본값에는 항상 0 값이 설정되어 있다고 가정합니다. 모든 경우에 해당되는 것은 아닙니다.
  • 파일 구성에서 0 값에 대한 명시적 재정의를 고려하지 않습니다.

JSON 언마샬링 접근 방식(권장)

더 우아하고 유연한 접근 방식은 Go의 인코딩/json 패키지를 사용하고 JSON을 비정렬화하는 것입니다. 데이터를 준비된 기본 구성으로 변환합니다. 이 방법은 여러 가지 장점을 제공합니다.

  • 누락된 값을 적절하게 처리합니다. 파일 구성에서 누락된 값은 기본값으로 채워집니다.
  • 기본값 재정의: 파일 구성에 제공된 값은 해당 값에 관계없이 기본값을 재정의합니다. type.
  • 0 값에 대한 명시적 재정의 지원: 파일 구성에서 명시적으로 0으로 설정된 값은 0이 아닌 기본값을 재정의합니다.

이를 보여주기 위해 접근 방식:

  1. 기본값으로 기본 구성 구조체 defConfig를 만듭니다. 값.
  2. 파일의 JSON 데이터를 문자열 변수 fileContent로 로드합니다.
  3. json.NewDecoder()를 사용하여 JSON 데이터를 defConfig로 역마샬링합니다.

예제 코드:

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 추천
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿