외부 패키지의 구조체 멤버에 대한 일반 함수
특정 필드를 다양한 Firebase 메시지 구조체에 추가하기 위한 단일 함수를 만드는 목표를 생각해 보세요. 유사한 유형의 공통 필드를 공유하는 Message 및 MulticastMessage와 같습니다. 처음에 다음과 같이 유형 제약 조건을 사용하여 일반 함수 highPriority를 정의하려고 시도하면 오류가 발생했습니다.
<code class="go">type firebaseMessage interface { *messaging.Message | *messaging.MulticastMessage } func highPriority[T firebaseMessage](message T) T { message.Android = &messaging.AndroidConfig{...} return message }</code>
Go 1.18의 제한
Go 1.18에서 액세스 유형 매개변수의 공통 필드 또는 메소드는 지원되지 않습니다. 따라서 이 접근 방식은 실패합니다.
해결책 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 1.18에서 제네릭을 사용하여 다양한 Firebase 메시지 구조의 필드를 설정하는 방법은 무엇입니까? * 진의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!