공통 멤버를 공유하는 여러 구조체에서 작동하는 일반 함수 작성 특히 이러한 구조체가 외부 패키지에 속하는 경우에는 어려울 수 있습니다. 이 문서에서는 이 시나리오를 해결하기 위한 다양한 솔루션을 살펴봅니다.
Message 및 MulticastMessage를 포함하여 Firebase 메시지 구조에 특정 필드를 추가하는 함수를 작성하기 위한 요구 사항을 고려하세요. 두 구조체 모두 동일한 유형의 Android 및 APNS 필드를 포함하지만 서로의 관계를 명시적으로 선언하지는 않습니다.
처음에는 일반 인터페이스인 firebaseMessage를 정의하려고 시도할 수 있습니다. , 그리고 다음과 같이 함수를 구현합니다.
<code class="go">type firebaseMessage interface { *messaging.Message | *messaging.MulticastMessage } func highPriority[T firebaseMessage](message T) T { message.Android = &messaging.AndroidConfig{...} .... return message }</code>
그러나 이 접근 방식은 "message.Android 정의되지 않음(T 유형에는 Android 필드 또는 메서드가 없음)" 오류로 인해 실패합니다.
간단한 해결책은 유형 스위치를 사용하여 각 특정 구조체 유형을 개별적으로 처리하는 것입니다.
<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>
이 방법은 공용체의 유형 수가 제한되어 있는 경우 효과적으로 작동합니다.
공통 멤버에 액세스하는 것이 필수적인 경우 한 가지 접근 방식은 공용체의 모든 구조체에서 호출할 수 있는 공통 메서드를 사용하여 래퍼 구조체를 만드는 것입니다. 단점은 다양한 유형에 대해 여러 래퍼 구조체를 만들어야 한다는 것입니다.
<code class="go">type wrappedMessage interface { *MessageWrapper | *MultiCastMessageWrapper SetConfig(c foo.Config) } type MessageWrapper struct { messaging.Message } func (w *MessageWrapper) SetConfig(cfg messaging.Android) { *w.Android = cfg } // same for MulticastMessageWrapper</code>
구조체가 많은 상황에서는 반사가 더 적절한 솔루션이 될 수 있습니다.
<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에서 이러한 시나리오를 처리하기 위한 몇 가지 실행 가능한 옵션을 제공합니다.
위 내용은 Go에서 외부 패키지의 일반 멤버가 포함된 구조체를 처리하기 위한 일반 함수를 작성하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!