일반 함수가 패키지 전체에서 관련되지 않은 구조체의 공유 필드를 수정할 수 있습니까?

DDD
풀어 주다: 2024-10-27 10:20:03
원래의
930명이 탐색했습니다.

 Can Generic Functions Modify Shared Fields in Unrelated Structs Across Packages?

일반 함수가 외부 패키지 구조체의 공유 멤버와 작동할 수 있나요?

문제:

목표는 다양한 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
}
로그인 후 복사

참고:

  • 솔루션 2는 유연성이 가장 뛰어나고 유형을 허용합니다. 안전합니다.
  • 솔루션 3은 보다 일반적인 접근 방식이지만 숙고가 필요하고 성능 오버헤드가 발생할 수 있습니다.

위 내용은 일반 함수가 패키지 전체에서 관련되지 않은 구조체의 공유 필드를 수정할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!