제네릭을 사용하여 공통 멤버가 있는 다양한 구조체 작업
Go에서는 다음에서 작동하는 일반 함수를 만들고 싶은 시나리오에 직면할 수 있습니다. 공통 멤버를 공유하는 다른 구조체. 그러나 Go 1.18에서는 공용체 유형 제약 조건을 통해 이러한 공통 필드에 직접 액세스하는 것이 아직 지원되지 않습니다.
도전 과제:
각각 다음을 포함하는 두 개의 메시지 구조체인 Message와 MulticastMessage를 생각해 보세요. Android와 같은 동일한 유형의 필드입니다. 이러한 필드를 두 구조체에 추가하는 일반 함수를 정의하려고 합니다. 그러나 두 구조체를 모두 포함하는 인터페이스로 제한된 유형 매개변수를 사용하면 공통 필드에 직접 액세스할 수 없습니다.
해결책:
해결책 1: 유형 스위치
관련 구조체가 몇 개만 있는 경우 유형 스위치를 사용할 수 있습니다.
<code class="go">func highPriority[T firebaseMessage](message T) T { switch m := any(message).(type) { case *messaging.Message: setConfig(m.Android) case *messaging.MulticastMessage: setConfig(m.Android) } return message }</code>
해결책 2: 메서드가 있는 래퍼
구조체가 많은 경우 공통 기능을 구현하는 메서드로 각 구조체를 래핑하는 것이 좋습니다.
<code class="go">type wrappedMessage interface { *MessageWrapper | *MultiCastMessageWrapper SetConfig(c foo.Config) } func highPriority[T wrappedMessage](message T) T { message.SetConfig(messaging.Android{"some-value"}) return message }</code>
해결책 3: 반사
구조체가 많으면 주소 지정이 가능한 구조체와 필드가 필요하지만 리플렉션이 더 나은 옵션일 수 있습니다.
<code class="go">func highPriority[T firebaseMessage](message T) T { cfg := &messaging.Android{} reflect.ValueOf(message).Elem().FieldByName("Android").Set(reflect.ValueOf(cfg)) return message }</code>
참고 및 대안:
위 내용은 Go에서 제네릭을 사용하여 공통 멤버가 있는 다양한 구조체를 작업하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!