문제:
목표는 다양한 Firebase 메시지 구조에서 특정 필드를 수정할 수 있는 일반 함수입니다. 유사한 유형의 필드가 중복됨에도 불구하고 Message 및 MulticastMessage 구조체에는 명시적인 관계가 부족합니다. 그러나 이를 처리하기 위해 인터페이스 제약 조건을 사용하려고 하면 오류가 발생합니다.
해결 방법 1: 유형 스위치
공용체의 유형 수가 적은 경우 유형 스위치 접근 방식이 작동할 수 있습니다. 여기에는 각 유형을 수동으로 처리하고 적절한 메소드를 호출하여 원하는 필드 값을 설정하는 작업이 포함됩니다.
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 }
해결책 2: 메소드가 포함된 래퍼
대체 솔루션에는 래핑이 포함됩니다. 원본 구조체를 저장하고 공유 필드를 설정하는 데 사용할 수 있는 래퍼의 공통 메서드를 정의합니다.
type wrappedMessage interface { *MessageWrapper | *MultiCastMessageWrapper SetConfig(c foo.Config) } type MessageWrapper struct { messaging.Message } func (w *MessageWrapper) SetConfig(cfg messaging.Android) { *w.Android = cfg }
해결책 3: 반사
구조체 수에 따라 리플렉션을 사용하여 공유 필드를 동적으로 설정할 수 있습니다. 그러나 이를 위해서는 주소 지정이 가능한 구조체와 필드가 필요합니다.
func highPriority[T firebaseMessage](message T) T { cfg := &messaging.Android{} reflect.ValueOf(message).Elem().FieldByName("Android").Set(reflect.ValueOf(cfg)) return message }
참고:
위 내용은 일반 함수가 패키지 전체에서 관련되지 않은 구조체의 공유 필드를 수정할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!